首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么以对象为键的赋值会改变javascript中的对象

以对象为键的赋值会改变JavaScript中的对象,是因为在JavaScript中,对象作为键时会被转换为字符串。当使用对象作为键进行赋值时,JavaScript会将对象转换为字符串,然后将该字符串作为键来进行赋值操作。

这种转换是通过对象的toString()方法来实现的。默认情况下,toString()方法会返回一个表示对象的字符串,该字符串由对象的类型和内部标识符组成。因此,不同的对象会被转换为不同的字符串,即使它们具有相同的属性和值。

由于对象作为键时会被转换为字符串,所以当使用不同的对象作为键时,它们会被转换为不同的字符串,从而导致不同的键值对。这就是为什么以对象为键的赋值会改变JavaScript中的对象。

举个例子,假设有两个对象obj1和obj2,它们具有相同的属性和值。当使用这两个对象作为键进行赋值时,它们会被转换为不同的字符串,因此会创建两个不同的键值对。

代码语言:txt
复制
let obj1 = { name: 'John' };
let obj2 = { name: 'John' };

let map = new Map();
map.set(obj1, 'value1');
map.set(obj2, 'value2');

console.log(map.get(obj1)); // 输出:value1
console.log(map.get(obj2)); // 输出:value2

在上面的例子中,尽管obj1和obj2具有相同的属性和值,但它们被转换为不同的字符串,因此在Map中创建了两个不同的键值对。

需要注意的是,由于对象作为键时会被转换为字符串,所以当使用不同的对象作为键时,它们会被视为不同的键,即使它们具有相同的属性和值。这可能会导致一些意外的行为,因此在使用对象作为键时需要特别注意。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

javascript对象属性赋值解析

版权声明:本文吴孔云博客原创文章,转载请注明出处并带上链接,谢谢。...概念: 在segmentfault社区找到相关概念: 当一个对象属性赋值是要遵循以下规则: 当对象原型链原型对象上有对应属性名,但是其是只读,那么对象属性赋值操作无效; 当对象原型链原型对象上有对应属性名...,但是其是可写,且设置了set方法,那么对象属性赋值操作无效,转而调用调用原型对象属性set方法; 当对象原型链原型对象上有没有对应属性名,那么直接在当前对象上添加这个属性(如果没有这个属性...)并赋值。...//通过知道属性只读,对象属性赋值操作无效,那么我们可以更改nameproperty-wirteabletrue,如下 Object.defineProperty(Animal, 'name',

1.8K30
  • JavaScript 对象

    对象 JavaScript 对象,Object,可以简单理解成“名称 - 值”对(而不是键值对:现在,ES 2015 映射表(Map),比对象更接近键值对),不难联想 JavaScript 对象与下面这些概念类似...正因为 JavaScript 一切(除了核心类型,core object)都是对象,所以 JavaScript 程序必然与大量散列表查找操作有着千丝万缕联系,而散列表擅长正是高速查找。...“名称”部分是一个 JavaScript 字符串,“值”部分可以是任何 JavaScript 数据类型——包括对象。这使用户可以根据具体需求,创建出相当复杂数据结构。...完成创建后,对象属性可以通过如下两种方式进行赋值和访问: // 点表示法 (dot notation) obj.name = 'Simon'; var name = obj.name; 和: // 括号表示法...它也可以被用来访问某些预留关键字作为名称属性值: obj.for = 'Simon'; // 语法错误,因为 for 是一个预留关键字 obj["for"] = 'Simon'; // 工作正常

    2.4K20

    JavaScript 对象赋值和浅拷贝区别

    赋值和浅拷贝区别 一直以为对象赋值对象浅拷贝是一样,但实际上它们还是有很大差异。 先看赋值,将一个对象赋值给一个新对象时候,赋其实是该对象在栈地址,而不是堆数据。...也就是一个对象改变就会改变另外一个对象。 再看浅拷贝,浅拷贝创建一个对象,再去遍历原始对象,如果原对象属性值是基础类型,那么就拷贝基础类型,如果是引用类型,则拷贝是指针。 是不是有点蒙蔽?...obj1 是源对象,obj2 是赋值得到,obj3 是浅拷贝得到,如果我们改变第一层数据不管是原始类型还是引用类型,那么 obj2 改变都会导致 obj1 改变。...总结 赋值和浅拷贝区别在于对象第一层数据对原对象影响,如果是赋值改变直接影响原对象。...如果是浅拷贝,而且属性值是基础类型的话,就不会影响原对象。属性值引用类型,就会影响原对象

    1K30

    如何高效检查JavaScript对象是否存在

    在日常开发,作为一个JavaScript开发者,我们经常需要检查对象某个是否存在。这看似简单,但其实有多种方法可供选择,每种方法都有其独特之处。...本文将介绍几种检查JavaScript对象方法,并比较它们性能。...} 直接访问一个不存在返回undefined,但是访问值undefined也是返回undefined。所以我们不能依赖直接访问来检查是否存在。...因此它对原型链上存在返回true。...); } 这种方法只会返回对象自身拥有的,而不会检查继承属性: 只检查自身,不包括继承 方法名清晰,容易理解 缺点是hasOwnProperty需要方法调用,在性能关键代码可能会有影响。

    11310

    Java对象不再使用时,不赋值null导致什么后果 ?

    对比两段代码,仅仅将placeHolder赋值null就解决了GC问题,真应该感谢“不使用对象应手动赋值null“。...等等,为什么例子里placeHolder不赋值null,GC就“发现不了”placeHolder该回收呢?这才是问题关键所在。...运行时栈 典型运行时栈 如果你了解过编译原理,或者程序执行底层机制,你知道方法在执行时候,方法里变量(局部变量)都是分配在栈上;当然,对于Java来说,new出来对象是在堆,但栈也会有这个对象指针...现在算是理清了“不使用对象应手动赋值null“原理了,一切根源都是来自于JVM一个“bug”:代码离开变量作用域时,并不会自动切断其与堆联系。为什么这个“bug”一直存在?...你不觉得出现这种情况概率太小了么?算是一个tradeoff了。 总结 希望看到这里你已经明白了“不使用对象应手动赋值null“这句话背后奥义。

    63520

    Javascriptwindow对象

    window对象两个作用: 表示浏览器一个实例 ECMAscriptGlobal对象 直接定义Global变量与在window上定义Global变量区别是:直接定义Global变量...[[configurable]]特性false,也就是说,它不能用delete删除 窗口关系及框架 如果html包含框架(frame),那么每个框架都有自己window对象,它们从上到下,从左到右...可以通过window.frames[index]或者window.frames[frame_name]来获取framewindow对象 window.nameframename top对象表示最外层...htmlwindow对象 parent对象表示上层framewindow对象 self表示frame自身window对象 窗口位置 window.screenLeft window.screenTop...或者firefoxwindow.screenX window.screenY表示窗口左上角位置 var left = (typeof window.screenLeft == “number”

    12310

    Javascript 对象拷贝

    说到 javascript 对象拷贝,首先我们想到是 Object.assign() ,  JSON.parse(JSON.stringify()) , 还有 ES6 展开操作符[... ] 因为在...js = 运算符 对于对象来说,不能创建副本,只是对该对象引用 运算符 var x = { a: 1, b: 2, }; y = x; x.a = 10; console.log(x);...Object.assign() 还需要注意一点是,原型链上属性不可枚举对象是无法复制,看一下代码: var x = { a: 1, }; var y = Object.create(x, {...ECMAScript 第 3 阶段提案,   拷贝对象更加简单了 var x = [ "a", "b", "c", "d", { e: 1, }, ]; var y...writable: false, }); console.log(x.m); //5 x.m = 25; //这一步没报错,但是也没执行 console.log(x.m); //5 那么这样一来,展开操作符复制对象到这里也遇到坑

    99640

    Java 对象传入方法内赋值后,为何执行完方法后对象值未改变呢?

    最后方法执行完毕后,lhygTaskMode 依然 null,这是为什么呢? 问题原因: 因为java只有一种传递参数方式:值传递。...对形参任何赋值操作都不会影响到实参,但是对于形参字段,或者元素(假如形参是一个数组)赋值操作影响实参。...值传递 引用传递 根本区别 创建副本 不创建副本 所有 函数无法改变原始对象 函数可以改变原始对象 场景说明: 如果你有一把钥匙,当你朋友想要去你家时候,如果你直接把你钥匙给他了,这就是引用传递...然后在changeObj方法内对参数进行修改时候,即a=new Test();,重新开辟一块 @6d06d69c内存,赋值给a。后面对a任何修改都不会改变内存@15db974内容(图3)。...所以说,Java其实还是值传递,只不过对于对象参数,值内容是对象引用。

    1.4K30

    关于人群研究对象业务建模

    最近有不少同学问人群研究对象业务建模问题,说明大家建模水平进步了,机构研究对象业务建模基本搞定了。 总原则:建模所画每一张图、所写每一个字都应该经过艰苦思考得来。...在实践,许多人满足于用轻易得到"正确无用废话"蒙骗自己和他人。 1、定位目标人群 《软件方法(上)》第2版也列举了一些错误。 P.40: ? P.49: ?...如果在侦破过程,福尔摩斯先认定了某某是凶手,那么他在推理和调查时可能会选择性忽略一些信息,最终导致冤案。也就是说,破案过程所花精力白费了,只是装模作样而已。 继续做题。...题目2:还是上面“宏博”例子。如果演艺明星人群研究对象,以下最正确是( ) A) ? B) ? C) ? D) ?...题目3:还是上面“宏博”例子。如果演艺明星人群研究对象描述业务流程,以下最正确是( ) A)抽象演艺明星共性,描述共有的业务流程。

    47010

    javascriptMath对象用法

    LN2 返回 2 自然对数(约等于0.693)。 LN10 返回 10 自然对数(约等于2.302)。 LOG2E 返回 2 e 对数(约等于 1.414)。...LOG10E 返回 10 e 对数(约等于0.434)。 PI 返回圆周率(约等于3.14159)。 SQRT1_2 返回返回 2 平方根倒数(约等于 0.707)。...asin(x) 返回数反正弦值。 atan(x) 介于 -PI/2 与 PI/2 弧度之间数值来返回 x 反正切值。...exp(x) 返回 e 指数。 floor(x) 对数进行下舍入。 log(x) 返回数自然对数(底e)。 max(x,y) 返回 x 和 y 最高值。...min(x,y) 返回 x 和 y 最低值。 pow(x,y) 返回 x y 次幂。 random() 返回 0 ~ 1 之间随机数。 round(x) 把数四舍五入最接近整数。

    1K10

    JavaScript 对象深拷贝

    JavaScript,对对象进行拷贝场景比较常见。但是简单复制语句只能对对象进行浅拷贝,即复制是一份引用,而不是它所引用对象。...而更多时候,我们希望对对象进行深拷贝,避免原始对象被无意修改。 对象深拷贝与浅拷贝区别如下: 浅拷贝:仅仅复制对象引用,而不是对象本身; 深拷贝:把复制对象所引用全部对象都复制一遍。...但是 Object.assign() 进行是浅拷贝,拷贝对象属性引用,而不是对象本身。 ? 二....深拷贝实现 要实现深拷贝有很多办法,有最简单 JSON.parse() 方法,也有常用递归拷贝方法,和ES5 Object.create() 方法。...但是当遇到两个互相引用对象,会出现死循环情况。 为了避免相互引用对象导致死循环情况,则应该在遍历时候判断是否相互引用对象,如果是则退出循环。 改进版代码如下: ?

    1K20

    JavaScript】内置对象 ① ( 内置对象简介 | JavaScript 三类对象 - 自定义对象 内置对象 浏览器对象 | 常用内置对象 )

    一、JavaScript 内置对象简介 1、JavaScript 三类对象 - 自定义对象 / 内置对象 / 浏览器对象JavaScript , 对象可以分为三类 : 自定义对象 , 内置对象..., 浏览器对象 ; 自定义对象 : 该类型对象是 开发者根据需求自己定义对象 , 用于表示现实世界实体或抽象概念 ; 自定义对象 一般 通过 字面量 或 new 操作符 + 构造函数 创建...; 内置对象 : 是 JavaScript 语言本身提供对象 , 提供了一些常用或最基本功能 ; 内置对象JavaScript 环境初始化时就已经存在 , 可以直接使用 , 不需要手动创建...; 2、JavaScript 中常用内置对象 JavaScript 内置对象JavaScript 语言自带对象 , 这些对象 提供给 开发者用于实现 常用 最基本功能 , 借助 内置对象...可以 帮助开发者 进行 快速开发 ; JavaScript 内置对象 提供了 语言常用核心功能 , 如 : 日期处理 / 数学计算 / 字符串操作 等功能 , 常用 内置对象如下 : Math

    26510

    Javascript数组对象排序(转载)

    一、普通数组排序 js中用方法sort()数组排序。sort()方法有一个可选参数,是用来确定元素顺序函数。如果这个参数被省略,那么数组元素将按照ASCII字符顺序进行排序。...二、数组对象排序 如果数组项是对象,我们需要根据数组项某个属性对数组进行排序,要怎么办呢?...这是因为当两个数字字符串比较大小时,会比较它们ASCII值大小,比较规则是:从第一个字符开始,顺次向后直到出现不同字符为止,然后第一个不同字符ASCII值确定大小。...Js数组排序函数sort()介绍 JavaScript实现多维数组、对象数组排序,其实用就是原生sort()方法,用于对数组元素进行排序。 sort() 方法用于对数组元素进行排序。...而我们对象数组排序,实际上原理也是一样

    7.5K20

    JavaScriptDate对象那些事儿

    在编程生涯,无时无刻都有一个时间来引导,如数据创建时间(createTime),更新时间(updateTime)等。今天来说说JavaScriptDate对象。...1、Date对象可以使用指定时间到1970年1月1日00:00:00 UTC毫秒数做参数。 ? 看到上面的结果是不是有点奇怪,当参数0时返回不应该是1970年1月1日00:00:00吗?...世界时间标准,就是UTC啦) 2、参数也可以是(年,月,日,时,分,秒),其中至少需要两个整数,否则就会被当做1例子里毫秒数了。...Date对象中有很多方法,这里我只挑一些常用来说下。 1、Date() 返回当前时间 ?...,Date()无论有没有参数都是返回的当前时间字符串,而new Date()根据参数返回对应时间字符串 分分钟写个小日历 使用Date()对象一个简单应用当然就是写日历了~ 首先,我们需要判断当前月份第一天是星期几

    86820
    领券