每日 3 题16 以下代码执行后,控制台中的输出内容为?

let a = { n: 1 };let b = a;a.x = a = { n: 2 };console.log(a.x);console.log(b.x);

17 以下代码执行后,控制台中的输出内容为?

let a = {};let b = "123";let c = 123;a[b] = "b";a[c] = "c";console.log(a[b]);

18 以下代码执行后,控制台中的输出内容为?

function user(obj) {  obj.name = "aaa";  obj = new Object();  obj.name = "bbb";}let person = new Object();user(person);console.log(person.name);

公众号【今天也要写bug】获取更多前端面试题

答案和解析16

// 答案:undefined { n: 2 }// 考察赋值运算符let a = { n: 1 };let b = a; // b 指向 { n: 1 }a.x = a = { n: 2 };// 首先找到 a.x 等待赋值,即对象 { n: 1 } 的属性 x// 然后计算赋值=右侧表达式:a = { n: 2 },将 a 赋值为一个新对象// a 赋值为一个新对象不会影响 b// 赋值表达式本身的值为要赋值的值,所以 a = { n: 2 } 返回 { n: 2 }// 所以 { n: 1 } 的属性 x 被赋值为 { n: 2 }console.log(a.x); // a 被赋值为 { n: 2 },没有属性 x,故输出:undefinedconsole.log(b.x); // b.x 即为 { n: 1 } 的属性 x,故输出:{ n: 2 }

17

// 答案:c// 考察对象的属性名、键访问// 对于对象 obj = { a: 1 }// obj.a 语法被称为“属性访问”// obj['a'] 语法被称为“键访问”// 在对象中,属性名永远是字符串// 如果使用 string 意外的值作为属性名,那么它首先会被转换为字符串let a = {};let b = "123";let c = 123;a[b] = "b"; // 此时 a => {'123':'b'}a[c] = "c"; // 此时 a => {'123':'c'}console.log(a[b]); // 输出 c

18

// 答案:aaa// 考察引用类型function user(obj) {  // obj 指向 person 引用的对象{}  obj.name = "aaa"; // obj person 引用的对象变为 {name:'aaa'}  obj = new Object(); // obj 引用新对象,对 person 无影响  obj.name = "bbb"; // obj => {name:'bbb'},对 person 无影响}let person = new Object(); // person => {}user(person);console.log(person.name); // person => {name:'aaa'}