1.[[Call]]
属性是函数独有的,代表该对象能够被执行。因为仅函数拥有该对象,ECMAScript定义typeof
操做符对任何具备[[Call]]
属性的对象返回“function”。正则表达式
注:某些浏览器曾经在正则表达式中包含
[[Call]]
属性,致使后者被错误鉴别为函数。如今,全部的浏览器行为都一致,typeof
不会再将正则表达式鉴别为函数。浏览器
2.函数具备两种字面形式。第一种为函数声明,第二种为函数表达式。这两种区别在于函数声明会提早,意味着能够先使用函数后声明。app
// 函数声明 function add(num1, num2){ return num1 + num2; } // 函数表达式 var add = function(num1, num2){ return num1 + num2; };
3.array.sort()方法,默认将全部值转成字符串,再进行比较。函数
var array = [1, 2, 7, 4, 10]; array.sort(function(a, b){ return a - b; }); console.log(array); // [1, 2, 4, 7, 10] array.sort(); console.log(array); // [ 1, 10, 2, 4, 7 ]
4.call、apply和bindthis
注:call调用方式,func.call(this. arg1, arg2),apply调用方式,func.apply(this, [arg1, arg2]),bind返回一个函数。code
var name = '李四'; var person = { name: '张三', sayName: function(){ console.log(this.name); } }; person.sayName(); // 张三 person.sayName.apply(window); // 李四 person.sayName.call(window); // 李四 var aaa = person.sayName; aaa(); // 李四 var aaa = person.sayName.bind(person); aaa(); // 张三
五、属性探测
因为属性能够在任什么时候候添加,因此有时候就有必要检查对象是否已有一个属性。如下模式探测是错误的。问题在于if判断中的值是一个对象、非空字符串、非零数字或true时,判断为真;而当值是一个null、undefined、0、false、NaN或空字符串时为假。因为一个对象属性能够包含这些假值,因此下面代码有可能会出现问题。更加可靠的判断属性是否存在应该是使用in操做符。in操做符在给定对象中查找一个给定名称的属性,若是找到则返回true。对象
if(peroson.age){ // do something }
在大多数时候,in操做符是最好的选择。可是当须要检查属性是自有属性仍是原型属性时,则须要使用hasOwnProperty()方法。该方法在给定的属性存在且为自有属性时返回true。
六、属性枚举ip
全部可枚举的属性均可以经过for-in循环遍历。可枚举属性的内部特征[[Enumerable]]都被设置为true。字符串
Object.keys()方法,能够某一对象的全部可枚举属性。get
for-in循环返回的和Object.keys()返回的可枚举属性有一个区别。for-in循环同时也会遍历原型属性,Object.keys()只返回自有(实例)属性。
可使用propertyIsEnumerable()方法检查一个属性是否为可枚举的。
var person = { name: '张三' }; person.propertyIsEnumerable('name') // true
七、属性特征
经过Object.defineProperty()方法来改变属性特征。Object.defineProperty()方法接受3个参数:拥有该属性的对象、属性名和包含须要设置的特征的属性描述对象。属性描述对象具备和内部特征同名的属性,但名字中不能包含中括号。因此能够用enumerable属性来设置[[Enumerable]]特征。
当使用Object.defineProperty()方法设置属性不可配置后,没法再次经过此方法设置为可配置。
经过Object.defineProperties()方法能够同时定义多个属性。该方法接收两个参数:须要改变的对象和一个包含全部属性信息的对象。
var person = {}; Object.defineProperties(person, { _name: { value: '张三', enumberable: true, configurable: true, writable: true }, name: { get: function(){}, set: function(){} } })
经过Object.getOwnPropertyDescriptor()方法能够获取属性特征。该方法接收两个参数:对象和属性名。若是属性存在,则返回一个属性描述对象。
Object.preventExtensions()建立一个不可扩展的对象。该方法接收一个参数,就是对象。经过Object.isExtensible()来检查[[Extensible]]的值。
Object.seal()封印对象。封印的对象是不可扩展的且全部属性都不可配置。经过Object.isSealed()判断对象是否被封印。
Object.freeze()冻结对象。冻结的对象是一个数据属性都为只读的被封印对象,被冻结对象没法解冻。经过Object.isFrozen()判断对象是否被冻结。