一个简单的js问题

clipboard.png

打印的结果是
clipboard.png
而不是
{name:'1222'}

阅读 4.4k
9 个回答

首先基本类型都是没有属性的,

像 var a = 10; var b = "abc";

你之所以可以访问 a.fixed方法, b.substr方法, 是因为JS引擎会把基本类型数据进行了一次包装, 比如 a 会包装 Number(a), b会包装成String(b), 这样就数字就能够使用fixed方法,字符串能够使用substr。

给数字和字符串添加属性是不会生效的, a.name ='this is your name' 其实是在给 Number(a)对象添加nane属性。
每次包装都会产生一个新的对象,新对象不存在name,因此访问a.name 返回 undefined。 console.log(a)就只是显示a的数值

因为typeof a === number

js是动态类型语言
所以类型会任意改变

所以 a 变成了 number类型

而不是object类型

javascript中有两种数据类型:

  • 值类型(基本类型):字符串(String)、数值(Number)、布尔值(Boolean)、UndefinedNull
  • 引用类型:对象(Object)、数组(Array)、函数(Function

js中一切皆为对象,基本类型原则意义上也是对象,基本类型可以像对象类型一样使用,通过obj.属性名或者obj[属性名]来访问、也可以通过obj.属性名=值或者obj[属性名]=值,来赋值(尽管实际上不起作用,但是形式上可以),所以语法上不会报错,但是不起作用。

至于你补充的问题,为什么一开始a定义的一个对象,后面给它添加方法的时候又不起作用了?因为在第二步重新指定了a的值,让它又等于了10,此时又变成了Number类型,所以下面添加name方法的时候又无效了。

举个例子:

let a = 10;
a = new Object();
a.name = 'this is your name';
console.log(a); // 'this is your name'

js变量定义没有类型概念,赋值会被直接覆盖!

因为a被赋值10的时候,数据类型就变为number,

后面a.name赋值的时候,a已经没有name属性了,所以没赋值成功,

即最后结果为10

因为两个a类型不同

给Number或者String添加属性是不会生效的,因为属性都给Number和String了

a = 10
a.name = 'this is your name'
相当于
10.name = 'this is your name'
但是10作为一个数字、一个基本类型,是没有属性可以用“.”来点出来的。它就是一个值,没有属性

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题