解析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 相关文章推荐
javascript IFrame 强制刷新代码
Jul 23 Javascript
使用js画图之画切线
Jan 12 Javascript
javascript中call和apply的用法示例分析
Apr 02 Javascript
jquery实现浮动的侧栏实例
Jun 25 Javascript
jquery+html5时钟特效代码分享(可设置闹钟并且语音提醒)
Mar 30 Javascript
JavaScript中利用for循环遍历数组
Jan 15 Javascript
jQuery实现字体颜色渐变效果的方法
Mar 29 jQuery
js实现移动端导航点击自动滑动效果
Jul 18 Javascript
详解给Vue2路由导航钩子和axios拦截器做个封装
Apr 10 Javascript
vue中倒计时组件的实例代码
Jul 06 Javascript
JavaScript enum枚举类型定义及使用方法
May 15 Javascript
浅谈Web Storage API的使用
Jun 23 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
APMServ使用说明
2006/10/23 PHP
php将textarea数据提交到mysql出现很多空格的解决方法
2014/12/19 PHP
用PHP代码给图片加水印
2015/07/01 PHP
Laravel中前端js上传图片到七牛云的示例代码
2017/09/04 PHP
javascript 动态加载 css 方法总结
2009/07/11 Javascript
Nodejs异步回调的优雅处理方法
2014/09/25 NodeJs
jQuery中end()方法用法实例
2015/01/08 Javascript
在浏览器中打开或关闭JavaScript的方法
2015/06/03 Javascript
node.js实现端口转发
2016/04/14 Javascript
限制复选框最多选择项的实现代码
2016/05/30 Javascript
jQuery使用经验小技巧(推荐)
2016/05/31 Javascript
Three.js利用性能插件stats实现性能监听的方法
2017/09/25 Javascript
JavaScript实现写入文件到本地的方法【基于FileSaver.js插件】
2018/03/15 Javascript
vue-cli 组件的导入与使用教程详解
2018/04/11 Javascript
nodejs中express入门和基础知识点学习
2018/09/13 NodeJs
JavaScript生成一个不重复的ID的方法示例
2019/09/16 Javascript
layui table 复选框跳页后再回来保持原来选中的状态示例
2019/10/26 Javascript
vue设置默认首页的操作
2020/08/12 Javascript
[46:55]Ti4 冒泡赛第二轮 LGD vs C9
2014/07/14 DOTA
Python自动化运维之IP地址处理模块详解
2017/12/10 Python
书单|人生苦短,你还不用python!
2017/12/29 Python
python3获取当前文件的上一级目录实例
2018/04/26 Python
python 不同方式读取文件速度不同的实例
2018/11/09 Python
python计算阶乘和的方法(1!+2!+3!+...+n!)
2019/02/01 Python
Python2与Python3的区别实例总结
2019/04/17 Python
Pytorch 计算误判率,计算准确率,计算召回率的例子
2020/01/18 Python
解决tensorflow添加ptb库的问题
2020/02/10 Python
VSCode配合pipenv搞定虚拟环境的实现方法
2020/05/17 Python
Keras 中Leaky ReLU等高级激活函数的用法
2020/07/05 Python
jupyter notebook快速入门及使用详解
2020/11/13 Python
用CSS3来实现社交分享按钮
2014/11/11 HTML / CSS
领导干部培训感言
2014/01/23 职场文书
几款流行的HTML5 UI框架比较(小结)
2021/04/08 HTML / CSS
Python基础教程,Python入门教程(超详细)
2021/06/24 Python
关于EntityWrapper的in用法
2022/03/22 Java/Android
SpringCloud超详细讲解Feign声明式服务调用
2022/06/21 Java/Android