解析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 异步调用框架 (Part 2 - 用例设计)
Aug 03 Javascript
js文本框输入点回车触发确定兼容IE、FF等
Nov 19 Javascript
JavaScript学习小结(7)之JS RegExp
Nov 29 Javascript
js中scrollTop()方法和scroll()方法用法示例
Oct 03 Javascript
jquery 手势密码插件
Mar 17 Javascript
简化vuex的状态管理方案的方法
Jun 02 Javascript
Vue头像处理方案小结
Jul 26 Javascript
微信小程序使用wxParse解析html的实现示例
Aug 30 Javascript
vue.js单文件组件中非父子组件的传值实例
Sep 13 Javascript
详解如何创建并发布一个 vue 组件
Nov 08 Javascript
layui type2 通过url给iframe子页面传值的例子
Sep 06 Javascript
Echarts在Taro微信小程序开发中的踩坑记录
Nov 09 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脚本[带参数]的方法
2010/01/22 PHP
一个php生成16位随机数的代码(两种方法)
2014/09/16 PHP
PHP的swoole扩展安装方法详细教程
2016/05/18 PHP
phpMyAdmin无法登陆的解决方法
2017/04/27 PHP
php readfile()修改文件上传大小设置
2017/08/11 PHP
ThinkPHP3.1.x修改成功与失败跳转页面的方法
2017/09/29 PHP
PHP中$GLOBALS与global的区别详解
2019/03/21 PHP
JavaScript 事件的一些重要说明
2009/10/25 Javascript
setTimeout与setInterval在不同浏览器下的差异
2010/01/24 Javascript
基于jQuery的投票系统显示结果插件
2011/08/12 Javascript
自己实现ajax封装示例分享
2014/04/01 Javascript
AngularJs学习第八篇 过滤器filter创建
2016/06/08 Javascript
Bootstrap树形菜单插件TreeView.js使用方法详解
2016/11/01 Javascript
js中动态创建json,动态为json添加属性、属性值的实例
2016/12/02 Javascript
详解Angular.js指令中scope类型的几种特殊情况
2017/02/21 Javascript
bootstrap table实现点击翻页功能 可记录上下页选中的行
2017/09/28 Javascript
微信小程序实现左侧滑栏过程解析
2019/08/26 Javascript
在layui中layer弹出层点击事件无效的解决方法
2019/09/05 Javascript
从表单校验看JavaScript策略模式的使用详解
2020/10/17 Javascript
使用typescript快速开发一个cli的实现示例
2020/12/09 Javascript
[48:21]林俊杰圣堂刺客超神杀戮秀
2014/10/29 DOTA
Python设计模式之代理模式实例
2014/04/26 Python
Python中的__slots__示例详解
2017/07/06 Python
快速了解Python开发中的cookie及简单代码示例
2018/01/17 Python
python爬取m3u8连接的视频
2018/02/28 Python
python直接获取API传递回来的参数方法
2018/12/17 Python
Python zip函数打包元素实例解析
2019/12/11 Python
Python3爬虫中Splash的知识总结
2020/07/10 Python
python 常用日期处理-- datetime 模块的使用
2020/09/02 Python
基于python获取本地时间并转换时间戳和日期格式
2020/10/27 Python
Miller Harris官网:英国小众香水品牌
2020/09/24 全球购物
大学生素质拓展活动方案
2014/02/11 职场文书
战略性融资合作协议书范本
2014/10/17 职场文书
公务员群众路线心得体会
2014/11/03 职场文书
2014年领导班子工作总结
2014/12/11 职场文书
Django rest framework如何自定义用户表
2021/06/09 Python