返回 登录
2

深入了解JavaScript对象--函数、对象

1.[[Call]]属性是函数独有的,表明该对象可以被执行。由于仅函数拥有该对象,ECMAScript定义typeof操作符对任何具有[[Call]]属性的对象返回“function”。

注:某些浏览器曾经在正则表达式中包含[[Call]]属性,导致后者被错误鉴别为函数。现在,所有的浏览器行为都一致,typeof不会再将正则表达式鉴别为函数。

2.函数具有两种字面形式。第一种为函数声明,第二种为函数表达式。这两种区别在于函数声明会提前,意味着可以先使用函数后声明。

// 函数声明
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和bind

注:call调用方式,func.call(this. arg1, arg2),apply调用方式,func.apply(this, [arg1, arg2]),bind返回一个函数。

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();    // 张三

5、属性探测由于属性可以在任何时候添加,所以有时候就有必要检查对象是否已有一个属性。以下模式探测是错误的。问题在于if判断中的值是一个对象、非空字符串、非零数字或true时,判断为真;而当值是一个null、undefined、0、false、NaN或空字符串时为假。由于一个对象属性可以包含这些假值,所以下面代码有可能会出现问题。更加可靠的判断属性是否存在应该是使用in操作符。in操作符在给定对象中查找一个给定名称的属性,如果找到则返回true。

if(peroson.age){
    // do something
}

在大多数时候,in操作符是最好的选择。但是当需要检查属性是自有属性还是原型属性时,则需要使用hasOwnProperty()方法。该方法在给定的属性存在且为自有属性时返回true。6、属性枚举

  • 所有可枚举的属性都可以通过for-in循环遍历。可枚举属性的内部特征[[Enumerable]]都被设置为true。
  • Object.keys()方法,可以某一对象的所有可枚举属性。

for-in循环返回的和Object.keys()返回的可枚举属性有一个区别。for-in循环同时也会遍历原型属性,Object.keys()只返回自有(实例)属性。

  • 可以使用propertyIsEnumerable()方法检查一个属性是否为可枚举的。
  • 学习看个人能力,javascript其实不难,标签不是蛮多,了解每个标签的属性及定义就行,要多写、多练,能熟练的组合搭配!
  • 如果你在学习javascript的过程中遇到什么问题或者想获取学习资源的话,欢迎加入 前端学习交流QQ群:615496236 我们一起学习javascript!
var person = {
    name: '张三'
};
person.propertyIsEnumerable('name')    // true

7、属性特征通过Object.defineProperty()方法来改变属性特征。Object.defineProperty()方法接受3个参数:拥有该属性的对象、属性名和包含需要设置的特征的属性描述对象。属性描述对象具有和内部特征同名的属性,但名字中不能包含中括号。所以可以用enumerable属性来设置[[Enumerable]]特征。

当使用Object.defineProperty()方法设置属性不可配置后,无法再次通过此方法设置为可配置。

评论