解析JavaScript中的不可见数据类型


Posted in Javascript onDecember 02, 2013

JS提供了一些内置对象、函数和构造器供我们编程,如Math、parseInt、Object、Array等。这些都是可见的,编程时可以使用的。比如我可以new Object 或 new Array。

有一些则是不可见的,这些对象只能由引擎在特殊的情形提供。这些类型的对象往往还被消减了一些功能。下面列举一些

一、Arguments 类型
Arguments 类型 不能由程序员手动创建其对象,即你不能 new Arguments() 。 它有且仅有一个对象arguments

function func() { 
    console.log(arguments[0])     // 1 
    console.log(arguments.length) // 3 
} 
func(1, 2, 3)

arguments对象是在函数调用的时候创建的,只在函数内部可见和使用。可以看到arguments很象Array,可以按索引取元素,也有length属性。但它不是Array,它没有Array的有一些方法比如push、pop等。Arguments 在ES5 10.6 里定义。

二、bind返回的函数很特殊
bind是ES5给Function.prototype新增的一个方法,它和call/apply一样在function上直接调用。它返回一个指定了上下文和参数的函数。

function func(age) { 
    console.log('name: ' + this.name + ', career: ' + age) 
} 
var person = {name: 'John McCarthy'} 
var f1 = func.bind(person, 'computer scientist') 
f1() // name: John McCarthy, career: computer scientist

可以看到返回的函数f1和普通函数一样使用小括号执行调用了。 一切正常,但下面的代码会让你大跌眼镜
function func(age) { 
    console.log('name: ' + this.name + ', career: ' + age) 
} 
var person = {name: 'John McCarthy'} 
var f1 = func.bind(person, 'computer scientist') 
console.log(f1.prototype) // undefined

和上面代码比较,就最后一句不同,没有执行f1(),而是打印出f1.prototype,发现是undefined。

奇怪吗? 每个function不都有一个prototype属性吗,这是用来实现原型继承的哦。的确,bind返回的function比较特殊,它没有prototype。这种特殊的函数是由JS引擎创建的,客户端程序员没法通过函数声明或函数直接量得到。

这一点在规范里有明确提示 ES5 15.3.4.5

解析JavaScript中的不可见数据类型

Javascript 相关文章推荐
js 返回时间戳所对应的具体时间
Jul 20 Javascript
jquery 实现密码框的显示与隐藏示例代码
Sep 18 Javascript
js获取当前路径的简单示例代码
Jan 08 Javascript
用JQuery实现全选与取消的两种简单方法
Feb 22 Javascript
jquery 选取方法都有哪些
May 18 Javascript
JavaScript运行机制之事件循环(Event Loop)详解
Oct 10 Javascript
浅谈Javascript线程及定时机制
Jul 02 Javascript
Treegrid的动态加载实例代码
Apr 29 Javascript
基于Phantomjs生成PDF的实现方法
Nov 07 Javascript
JavaScript之WebSocket技术详解
Nov 18 Javascript
详解搭建一个vue-cli的移动端H5开发模板
Jan 17 Javascript
微信小程序 WeUI扩展组件库的入门教程
Apr 21 Javascript
Jquery使用Firefox FireBug插件调试Ajax步骤讲解
Dec 02 #Javascript
jquery遍历之parent()和parents()的区别及parentsUntil()方法详解
Dec 02 #Javascript
jQuery向上遍历DOM树之parents(),parent(),closest()之间的区别
Dec 02 #Javascript
javascript中对Attr(dom中属性)的操作示例讲解
Dec 02 #Javascript
浅析jquery的作用与优势
Dec 02 #Javascript
jquery获取css中的选择器(实例讲解)
Dec 02 #Javascript
jquery中的查找parents与closest方法之间的区别
Dec 02 #Javascript
You might like
PHP+DBM的同学录程序(5)
2006/10/09 PHP
php错误级别的设置方法
2013/06/17 PHP
PHP动态输出JavaScript代码实例
2015/02/12 PHP
php使用cookie实现记住用户名和密码实现代码
2015/04/27 PHP
php生成0~1随机小数的方法(必看)
2017/04/05 PHP
php多进程应用场景实例详解
2019/07/22 PHP
js防止表单重复提交的两种方法
2013/09/30 Javascript
javascript通过className来获取元素的简单示例代码
2014/01/10 Javascript
jquery1.10给新增元素绑定事件的方法
2014/03/06 Javascript
解决jQuery使用JSONP时产生的错误
2015/12/02 Javascript
浅谈几种常用的JS类定义方法
2016/06/08 Javascript
angular基于路由控制ui-router实现系统权限控制
2016/09/27 Javascript
微信小程序 基础组件与导航组件详细介绍
2017/02/21 Javascript
MUI 解决动态列表页图片懒加载再次加载不成功的bug问题
2017/04/13 Javascript
JavaScript调试之console.log调试的一个小技巧分享
2017/08/07 Javascript
js封装成插件_Canvas统计图插件编写实例
2017/09/12 Javascript
一个有意思的鼠标点击文字特效jquery代码
2017/09/23 jQuery
JavaScript生成简单等差数列
2017/11/28 Javascript
js断点调试心得分享(必看篇)
2017/12/08 Javascript
layui之select的option叠加问题的解决方法
2018/03/08 Javascript
JavaScript实现简单动态进度条效果
2018/04/06 Javascript
详解Node.js 中使用 ECDSA 签名遇到的坑
2018/11/26 Javascript
layui实现下拉框三级联动
2019/07/26 Javascript
javascript实现倒计时效果
2020/02/17 Javascript
[01:00:13]完美世界DOTA2联赛 LBZS vs Forest 第一场 11.07
2020/11/09 DOTA
[01:02:00]DOTA2-DPC中国联赛 正赛 Elephant vs IG BO3 第三场 1月24日
2021/03/11 DOTA
Python实现从订阅源下载图片的方法
2015/03/11 Python
python获取list下标及其值的简单方法
2016/09/12 Python
python实现mysql的读写分离及负载均衡
2018/02/04 Python
Django中自定义模型管理器(Manager)及方法
2019/09/23 Python
DBA的职责都有哪些
2012/05/16 面试题
2014村务公开实施方案
2014/02/25 职场文书
标准化管理实施方案
2014/02/25 职场文书
经典公益广告词
2014/03/13 职场文书
导游词之无锡唐城
2019/12/12 职场文书
Go 语言结构实例分析
2021/07/04 Golang