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()方法检查一个属性是否为可枚举的。
var person = {name: '张三'
};
person.propertyIsEnumerable('name')    // true

7、属性特征

  • 通过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()判断对象是否被冻结。

转载于:https://www.cnblogs.com/shijianxiaoyu/p/7074619.html

深入了解JavaScript对象(2)--函数、对象相关推荐

  1. 函数对象、 函数对象与容器、函数对象与算法

    一.函数对象 1.函数对象(function object)也称为仿函数(functor) 2.一个行为类似函数的对象,它可以没有参数,也可以带有若干参数. 3.任何重载了调用运算符operator( ...

  2. python 返回函数对象_Python—函数对象与闭包

    一 函数对象 函数对象指的是函数可以被当做"数据"来处理,具体可以分为四个方面的使用. 1.1 函数可以被引用 def index(): print('from index') a ...

  3. 函数对象 java_函数对象

    函数对象 * 一种将函数作为参数传递的独创方法 是注意到 在我们想传递的参数 即包含数据 也保包含方法,于是我们可以定义一个 * 不包含数据 只 包含方法的类,并传递该类的一个实例,事实上,一个函数通 ...

  4. 从零开始学C++之STL(八):函数对象、 函数对象与容器、函数对象与算法

    http://blog.csdn.net/jnu_simba/article/details/9500219 一.函数对象 1.函数对象(function object)也称为仿函数(functor) ...

  5. Python学习笔记7:函数对象及函数对象作參数

    一.lambda函数 比如: fun1 = lambda x,y: x + y print fun1(3,4) 输出:7 lambda生成一个函数对象.该函数參数为x,y,返回值为x+y.函数对象赋给 ...

  6. 对象和函数对象有什么区别?

    如下两段代码,分别是使用对象字面量和构造函数创建对象. 代码段1: var a={"name":"nihao"};console.log(a); 代码段2: v ...

  7. 【C++】什么是函数对象和函数对象的用处

    目录 什么是函数对象 函数对象的用处 什么是函数对象 class myprint {public:void operator()(int num){cout << "num &q ...

  8. 深入探讨JavaScript函数对象

    人人生而平等,但有些人比其他人更加平等--奥威尔 函数是进行模块化程序设计的基础,编写复杂的Ajax应用程序,必须对函数有更深入的了解. javascript中的函数不同于其他的语言,它的每个函数都是 ...

  9. python 函数可以作为容器对象的元素_python第十二天, 三元表达式, 函数对象,名称空间与作用域,函数的嵌套定义...

    复习 1. 字符串的比较: 2. 函数的参数:形参与实参 3. 实参的分类:位置实参与关键字实参 4. 形参分类: 1.无值位置形参 2.有值位置形参 3.可变长位置形参 4.有无值关键字形参 5.可 ...

  10. Function:函数对象

    2. 基本对象Function:函数对象Array:Date:Math:RegExp:Global:<!DOCTYPE html> <html> <head>< ...

最新文章

  1. vue进行判断使用class_vue判断dom的class
  2. 【渝粤教育】广东开放大学 物权法 形成性考核 (43)
  3. JVM类加载机制_字节码执行引擎_Java内存模型
  4. 坯子库和suapp哪个好用_「双全科技」进销存软件哪个简单好用,管家婆进销存软件教程...
  5. java怎样生成32位全是整形的主键_用java生成32位全球唯一的id编号
  6. Openfire插件开发
  7. 第100篇博文纪念 | C# 根据数据库表结构生成DOC数据库文档
  8. Maven的配置和使用(三)
  9. 学习ARM64页表转换流程
  10. 【学习笔记】Nake Statistics
  11. 计算机仿真软件在医疗应用,医学虚拟仿真应用介绍
  12. mui android 模拟器,MUI框架-07-HBuilder+夜神安卓模拟器
  13. 佳佳数据恢复软件免费版
  14. 安装Adobe全家桶时出现The installation cannot continue as the installer file may be damaged.解决方法。
  15. Word、PPT、PDF 文件怎么批量插入首页、扉页、尾页?怎么在指定位置插入页?
  16. RTFM:Weakly-supervised Video Anomaly Detection with Robust Temporal Feature【ICCV 2021】附代码注释
  17. 计算机中函数vlookup怎么用,教您使用excel函数vlookup
  18. 邮件服务配置(虚拟域虚拟用户)
  19. 【C语言学习04】跳出嵌套循环
  20. iOS Objective-C(2014-1-6 20:30、20140114,20140824,20150926、20160106、20160110、20160123)

热门文章

  1. SparkSQL使用之Thrift JDBC server
  2. 常用实验资源共享整理 20111026
  3. linux-DNS(bind)-setting
  4. 使用Embedded VC++开发通讯终端及代码分析
  5. 改变自己,YT,吵架,和好,感冒,烦,新的项目,旧的垃圾,呵呵呵。。
  6. 一个class运用promise的延时调用
  7. 《代码敲不队》第五次作业:项目需求分析改进与系统设计
  8. archlinux 安装 Windows 字体
  9. [书目]软件制胜之道:执行的策略
  10. 微软经典案例系列课程(视频课程讲师:杨丹)