-
js的隐式转换(+和-)
巧用+/-: 如果要把一个字符串变数字,用字符串-0 如果把数字变字符串,用数字+0
a===b(类型和数值都相同)
NAN≠NAN new Object ≠ new Object
a==b
null == undefined number == string 转number(1==“1.0”)
Boolean == ?转number(1==true)
object == number|string 尝试将对象转为基本型 new String('hi') == 'hi'
查看全部 -
js有弱类型特性
js六种数据类型:number string Boolean null undefined object(function array date)
查看全部 -
bind方法模拟
在不支持ES5的浏览器里模拟bind方法
几个注意地方:
1.var aArgs=Array.prototype.slice.call(arguments,1);//这里的arguments是相对function(oThis)而言的,也即对应的是oThis这个参数,这个oThis又是对应bind()里面的参数的,由于bind()第一个参数是对象,后面还可以是用于currying的参数,所以通过slice将后面的参数获取。由于arguments不是标准的数组,需通过数组原型链的调用来使用slice方法。
2.aArgs.concat(Array.prototype.slice.call(arguments)) //这里的arguments是对应fBound=function()这个匿名函数的,而fBound作为最后的返回,对应的是函数bind后赋给的变量(函数),后者再次调用时传入的参数就是这里的arguments,将上面currying的参数并上后面再传入的参数,才组成最开始的函数的参数this/fToBind。
3.fNOP空对象是为了作为通过new之后消除bind作用后函数中this指向空对象的原型链准备。而通过this instanceof fNOP来判断是否使用了new,并决定将对象bind上。没用new,则判断为false,bind(oThis);否则为true,即使用new,函数中this指向空对象。查看全部 -
bind方法
不同的调用方法下,this 指向不同的值
module.getX(); //this 指向module,返回 81
var getX = module.getX;
getX(); // this 指向 全局变量,返回9
var boundGetX = getX.bind(module);
boundGetX(); // this 被 bind 向 module,返回81查看全部 -
this指向:
1、直接调用函数(<function>()):this指向全局对象。
2、方法调用模式(<object>.<function>()):this指向调用者<object>。
3、构造函数调用模式(obj = new <function>()):this指向被构造者obj。
4、apply/call/bind方法:this指向方法的第一个参数。
5、严格模式下,this不允许指向全局对象,此时this值为undefined。查看全部 -
Array.isArray:判断是否为数组
实例:Array.isArray(<val>)
返回值:如果<val>时数组,则返回true,否则返回false。
注意:当检测<arr>实例时,isArray方法优于instanceof,因为isArray能检测iframe。
此方法为ES5方法,IE8-不支持。查看全部 -
forEach:遍历数组元素的方法,arr.forEach(function(x,index,a){});//x具体的元素值,index对应的下标,a数组本身
map:数组映射,var arr=[1,2,3];arr.map(function(x){return x+10;});//[11,12,13] arr;//[1,2,3]不会修改原数组
filter:数组过滤,原数组不被修改,arr.filter(function(x,index){})
every:表示每一个元素都要符合一定的条件 var arr=[1,2,3];arr.every(function(x){return x<10;});//true
some:只要任意一个元素符合条件就可以了,every相当于逻辑与,some相当于逻辑或
reduce:数组两个元素两两操作var arr=[1,2,3];arr.reduce(function(x,y){return x+y;},0);//6,这里的0是和1最开始进行相加的,每次结果作为新的x,下一个元素作为y,原数组未被修改
reduceRight:是从右到左开始遍历的,其他的还是跟reduce一样的,都可以将数组聚合成一个结果
indexOf:arr.indexOf(a);//表示元素值为a的所在数组的下标位置,arr.indexOf(a,i)从下标为i的元素开始查找元素值为a的下标位置
lastIndexOf:与indexOf差不多,只不过是从右到左开始查找的,返回元素所在的下标位置
isArray:判断是否为数组,必须用Array构造器对象调用
其他的判断是否数组的方法:
[] instanceof Array;//true
({}).toString.apply([])==='[object Array]';//true
[].constructor === Array;//true查看全部 -
1.join()方法 默认是将字符串转换为字符串,并以“,”隔开元素,而join()中的参数就是替换字符串中的“,”,
而new Array(n+1).join(str)的原理是,创建一个n+1大小的数组,若用join()方法会产生含n个“,”的字符串,而str正好代替这些“,”以造成重复n次str参数的字符串。
2.reverse()方法 将数组的顺序颠倒,注意:原数组会被改变成颠倒后的数组。
3.sort()方法 sort()方法只会对数组进行字符顺序上的排序,例如a,b,c,d,而如果是数字,则会取第一位数的字符顺序进行排序,改完以后原数组会被修改。如果想用sort进行数字上的排序,则应写入函数参数function(a,b){return a-b;},这是升序排列,反之降序是b-a。
4.concat()方法 作用是合并数组,返回值是合并后的数组,原数组不会改变。如果参数是一个一维数组(没有嵌套),则合并的时候会拉平数组,如果是嵌套数组,合并后只会拉平最外一层。
5.slice()方法 切断数组,原数组不会修改,如果传入一个参数n,则返回第n+1个到最后一个元素的数组,如果传入n,m,则返回第n+1到m元素的数组,-1代表最后一个元素,-2代表倒数第二个元素,以此类推,若输入的参数为负数i,j,则返回倒数第|i|个到倒数第|j|+1个元素,总结来说,对于正数,左区间开,对于负数,右区间开。
6.splice胶结方法 切断数组胶结数组,原数组会被修改,输入参数n,那么原数组第n+1个元素到最后一个元素都会被删除(会作为该函数的返回值),如果输入参数m,n,则删除第m+1个到第m+n个元素。如果输入两个以上的参数则删除前两个参数所指定的元素,替换上剩下的参数。查看全部 -
Object.getOwProertyDescriptor(obj,property_name);<br>
value: 属性值
writable: 该属性是否可写,可改变<br>
enumerable:该属性是否可被枚举,就是可在for in中出现<br>
configurable: 该属性的标签是否可改变,是否可用delete将该属性删除。
用defineProperty定义属性时,默认configurable为true,如果设置为false后,该属性不管是什么方式都无法更改。查看全部 -
注意:
1. 用for-in遍历时,原型链上的属性也会被遍历到,而且是无序遍历。
2. 属性删除用delete, prototype属性不可被删除;var定义的变量也不可用delete删除,函数也不可以被delete掉(经验证,不同的内核实现方式不同,在chrome下不可被delete掉,返回false,但在firefox和IE10下可以被delete掉,返回true,对于函数也是相同的结果)查看全部 -
var obj=Object.create({x:1});
obj.x;//1
typeof obj.toString;//"function" //toString()来源Object源型链
obj.hasOwnProperty("x");//false
//原型链继承关系 :
obj->{x:1}->Object prototype ->null;
并不是所有对象都有toString()方法
var obj=Object.create(null);
obj.toString //undefined
此时原型链继承关系 :obj->null。所以无toString()方法查看全部 -
in 和 hasOwnProperty
in是判断该对象是否具有所要查找的属性
而hasOwnProperty则是判断该对象的实例是否具有所要查找的属性
因此可以自定义一个查找对象属性所在位置的函数:
function hasProperty(obj,property){
return obj.hasOwnProperty(property) && property in obj;
}//返回true时表示该属性在它的实例上,否则就在原型上查看全部 -
对象构造:
除了本身被赋予的值之外,对象还有几个隐藏标签:
proto:对象的对象属性prototype上的赋值
class:对象的种类
extensible:是否允许该对象继续增加新的属性
另外对象的值(如 x=1),也有对应的属性或方法,提供一些访问权限的控制
writable:是否可写
enumerable:是否能被删除
configurable:是否能够枚举
value:值
get/set:查看全部 -
特殊运算符的种类:
1、条件运算符 c?a:b c为true 则取a,否则取b
2、逗号运算符 a,b 例如 var s = (1,2,3),则s依次赋值,最后输出为3
3、delete运算符 delete obj.x 删除对象obj中的x属性 在IE9下,obj中必须configurable:true 才可以删除,否则无效
4、in运算符 判断obj是否有值或window里是否有变量,返回布尔值 例如 attr in json 或 'document' in window
5、instanceof 判断对象类型 {} instanceof Object // true
6、new运算符 创建一个新对象 new obj / new array ...
7、this对象 全局用指向window,函数内指向函数本身,浮动指针
8、typeof 判断对象,返回对象类型 例如 typeof 100 === 'number' // true
9、void 一元的,判断所有值,返回均为undefined查看全部 -
过hasOwnProperty()判断属性到底是 对象上的 还是 对象的原型链上的
查看全部
举报