为什么111[0]返回的是undefined

var num = 1111
console.log(num[0]) // undefined

为什么不会报错,而是返回 undefined?

阅读 2.2k
3 个回答

因为 Number.prototype 上没有 '0' 这个属性,所以返回 undefined
图片描述

因为特定情况下,基本类型会在需要的时候被转为包装类型,相当于一个隐式的强制类型转换,这里用到[]取值就会把基本的数字转成了Number类型的对象。
Boolean,Number,String三种包装类型对应三种基本类型。

这其中包含三个知识点:

  • 原始数据类型和js里的基础对象的区别:变量定义可以为原始数据类型numberstring等,而js里另有一套NumberString等内置对象类型。num = 1111时定义的是一个原始数据类型的变量。此时它还不是js的内置Number对象类型。
  • 隐式转换:当你在原始数据上使用js内置对象的功能时会把原始数据包装成内置对象再执行相应的方法,比如这个例子是num = 1111,当使用到num[0]时就在内部执行了Number(num),这个就是隐式转换。
  • 原型链查找机制:当被被隐式转换后,num[0]相当于是一个对象,在对象上查找一个为'0'的属性,会触发对象内置的属性查找方法,此方法是利用原型链的机制来查找属性的,即num上没定义这属性,会继续往num的原型链上查找,找到最后就是Object.prototype,这个对象上也没有定义'0'这个属性,最后会报undefined,这是js机制决定的。即便你有一个属性是undefined,这样的查找方式也无法将有没有这个属性真正区分开。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题