js中为什么不能给基本类型的变量添加属性和方法?

js中不是一切皆对象吗? 为什么不能给基本类型的变量添加属性和方法

阅读 9.3k
5 个回答

说“JS中一切皆对象”也对也不对。

说它不对,是因为实际上JS中包括两种类型的值:

  • 基本类型:包括数值类型、字符串类型、布尔类型等

  • 对象类型

两者是有本质区别的。

说它对,是因为在某些情况下,基本类型会表现得“很像”对象类型,使得用户可以像使用对象一样去使用基本类型数据。某些情况主要指“对属性的赋值和读取”。

以数值类型为例:

var a = 12.3;
console.log(a.toFixed(3)); // 输出"12.300"

a.foo = 'bar';
console.log(a.foo); // 输出undefined

上述代码说明,基本类型可以像对象类型一样使用,包括访问其属性、对其属性赋值(尽管实际上不起作用,但是形式上可以)。

之所以能这样去使用基本类型,是因为JavaScript引擎内部在处理对某个基本类型 a进行形如a.sth的操作时,会在内部临时创建一个对应的包装类型(对数字类型来说就是Number类型)的临时对象,并把对基本类型的操作代理到对这个临时对象身上,使得对基本类型的属性访问看起来像对象一样。但是在操作完成后,临时对象就扔掉了,下次再访问时,会重新建立临时对象,当然对之前的临时对象的修改都不会有效了。

可以在基本类型的 prototype 上面添加属性和方法,不过一般来说是不建议的。

基本上都是用在兼容低版本浏览器不支持的方法,如果 array 的 foreach 方法等。

js并不是一切皆对象。

js的基本数据类型有字符串、数字、布尔、数组、对象、Null、Undefined几种。

具体内容请参考MDN

在 JavaScript 中,几乎所有的东西都是对象。所有的原生类型除了 null 与 undefined 之外都被当作对象。它们可以被赋予属性(某些类型的被赋予的属性不能被持久化),并且它们都有对象的全部特征。

以上请参考MDN

//以下是个人见解

//通过直接量声明的基本类型变量, 属性与方法都是只读的
var str = '123';
var num = 123;
var arr = [1,2,3];
var bool = false;
var n = null;

str.alert = function () {
    console.logt(this);
}
str.alert(); //报错, undefined is not a function, 因为属性只读, 所以并没有写入, 也就是MDN说得不能持久化


//通过基本类型的构造函数声明
var str = new String('123');
var num = new Number(123);
var arr = new Array(1,2,3);
var bool = new Boolean(false);

str.alert = function () {
    console.logt(this);
}
str.alert();  //正确输出



//Object是一切的基类, 证明
Object.prototype.test = function () {
    console.log('just test');
}
var t = 123;
t.test();  //输出just test


//通过构造函数拓展基本类型方法
String.prototype.console = function () {
    console.log(this);
}
var s = '123';
s.console();

基本类型有时会转变成临时包装对象。可理解为装箱。完了之后还是基本类型。可理解为拆箱。java中有这个概念

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