Array类的length是可读可写的量。通过length可以裁剪数组
Array.prototype.push将会返回Push之后的长度
Array.prototype.concat()可以接收多个参数。并把这些都全部加在一个数组里,不过不会修改原数组
splice方法。
提供两个参数。第一个参数是要删除元素的起始位置,第二个是要删除的元素的个数。
提供多个参数,进行删除插入。前两个参数负责删除,后面的负责插入。如果不删除,第二项填0
字面量在判定相等的时候都是即便是内容相等也返回false
var a={prop:1}
a==={prop:1};//false
a=={prop:1};//false
函数表达式需要等到执行到才可以执行。函数声明则不
最好用arguments.callee进行解耦
引用类型和基本包装类型最主要的就是对象的生存期。如果是使用new创建的引用类型实例,那么执行流会一直生存到当前作用域结束。如果是自动创建的则其基本包装类对象只存在一瞬间。
var s = "sad";
s.color = "red";
s.color;//null
需要注意的是,使用new调用基本包装类性的构造函数和直接调用同名函数的结果是不一样的。
var number = Number("123");
typeof number;//number
var number2 = new Number("123");
typeof number2;//Object
获取字符串中某位置字符方法:charAt()
获得某位置ASCCI码方法:charCodeAt()
由于str也是可以通过下标访问的,因此可以通过Array.prototype.func.call来调用数组方法。
trim()方法不会修改字符串内容,只会创建副本。
使用encodeURIComponent()
函数对所有非字母数字进行编码。decodeURIComponent()
进行解码。
执行过一次bind后返回的对象将不能再次bind.
每一个数据属性都有四个特性:
- [[Configurable]]:表示能否通过delete删除属性从而重新定义属性
- [[Enumerable]]表示能否通过for-in循环返回属性。
- [[Writable]]表示能否修改属性的值
- [[Value]]表示值
var a = {_name:123}
Object.defineProperty(a, 'name', {
get:function(){
return "我是"+this._name;
},
set:function(newVal){
if(newVal>20){
this._name=newVal;
}
}
})
这里_name是数据属性,我们定义了访问器属性name,通过name也可以访问到_name属性并且灵活的调整set和get。
通过Object.defineProperties()
方法可以给对象一次性定义多个访问器属性。
Object.defineProperties(
a,{_name:{value:23,writable:false},{name:{get:function(){return this._name;},set:function(){}}
}
}
)
第一个参数填需要进行更改的对象,第二个参数填入字面量,字面量内是每一个要添加的属性的数据属性/访问器属性内容
只要是继承的,typeof都会返回true。
可以通过对象实例来访问保存在原型中的值,但是不能通过对象实例来重写原型中的值,他会在实例的属性中添加这个值并且遮盖掉原型链中的值。但是通过__proto__.prop
就可以访问到。
即便是在实例中设置属性为null也不会消除对原型属性的遮蔽。除非使用delete
可以通过hasOwnProperty()
来获取到实例中是否有这个属性而不考虑原型链的。
如果要判断实例有这个属性(包括原型链中的属性)用in这个操作符。
通过for-in循环返回的是对象能够访问到的(包括原型链),而且enumerable设置为true的属性
Object.defineProperty(c,'name',{enumerable:false})
for(ele in c){console.log(ele);}//only age
Object.keys(obj)//将返回所有可枚举的,属于实例对象的属性的属性名数组。
Object.getOwnPropertyNames(obj);//返回的是所有实例属性(不包括原型链),不管是否可枚举