首页 > 试题广场 >

以下哪些代码执行后i的值为10:

[不定项选择题]
以下哪些代码执行后i的值为10:
  • let i =1 + {
      valueOf() { return 9; }
    };
  • let i = 0;
    new Array(10).forEach(() => {
      i++;
    });
  • let i = parseInt('0xA');
  • let i = 5;
    function a(i) {
      i *= 2;
    }
    a(i);

B选项输出值为0是因为forEach方法在数组元素为空时会跳过执行回调函数,相当于此选项回调函数并未执行,所以还是输出0。

发表于 2019-08-18 18:14:34 回复(3)
A选项,{ valueOf() { return 9; } } 是一个匿名对象,该对象有一个名为valueOf的方法,对象与数字相加时,对象调用自身的valueOf方法转换为数字,故输出 i == 1 + 9 == 10;
当对象没有提供valueOf方法时,对象与数字都转换为字符串相加
1 + {} == '1[object Object]'

编辑于 2020-03-17 21:11:32 回复(4)

A:

如果在需要使用原始值的上下文中使用了对象,就会自动调用valueOf方法.这里重写了默认的valueOf 方法。

所以相当于 let i = 1+9

B:

forEach方法按升序为数组中含有效值的每一项执行一次 callback函数,那些未初始化的项将被跳过。

new Array(10)创建的数组默认值都是undefined,所以回调函数都会被跳过。

C: 

在没有指定基数的情况下,如果字符串以"0x"或者"0X"开头, 则基数是16 (16进制)。

相当于let i = parseInt('0xA',16)

D: 

i是形参,,属于局部变量,不影响全局变量i的值

发表于 2020-01-13 16:05:02 回复(5)
D选项,由于函数没有返回值,执行a(i)后,返回undefine。此时外部i还是为5;内部i为10,随着函数执行完,内部变量被清除。
发表于 2019-09-06 09:45:16 回复(5)
A 中的加***使得对象发生类型转换,从而调用内部的 valueOf 方法
发表于 2019-09-10 15:08:55 回复(0)
A: 当对象遇到原始类型相加时,会调用 一个叫 valueOf() 的方法,这里重写了这个方法,所以返回9
B: new Array(10) 只是放了10个占位符,里面其实是空的,所以,forEach 用在空数组时是不会执行的,所以没有执行。
C: parseInt 这个有点坑,它会首先识别前面两个字符,当识别到 0x 或者0X 时,会按照16进制来转换。
发表于 2020-11-17 22:02:05 回复(0)
c选项,是十六进制解析 parseInt("ff",16) parseInt("0xff") 效果一样
发表于 2019-08-28 14:55:04 回复(0)
D选项,a函数外的i是全局变量,a函数内的i是局部变量,互不影响,因为a函数里面没有return返回值,所以a(i)输出undefined,外面那个i依然是5。
编辑于 2021-08-21 11:03:28 回复(0)
<p>下面有位老哥表述有一点点问题:new Array(10)不是生成了10个undefined,而是生成了10个empty。如果是10个undefined的话,调用forEach是可以执行回调的</p><p><br></p>
发表于 2020-06-30 20:00:24 回复(0)
D阴就阴在形参也是i,和有没有返回值没有关系,函数内部计算的是局部变量的形参i,不影响全局的变量i
发表于 2020-06-29 14:22:08 回复(1)

选项B,forEach不对未初始化的值进行任何操作(稀疏数组),new Array(10)只是创建了数组,没有初始化,所以不会执行回调函数。

如果进行了初始化,就会返回10

let i = 0;
new Array(10).fill(0).forEach(() => {
    i++;
});

选项D,a函数里面的i是函数内部的局部变量,跟全局的i没有关系。所以全局的i还是5

编辑于 2020-05-25 00:06:00 回复(0)
d选项 i是行参,属于局部变量。结果还是5
发表于 2019-08-26 02:40:25 回复(0)
一、数组的创建
在讨论数组初始化之前,首先要知道数组的两种创建方式:

构造函数的创建方式 const a = new Array(2)
数组字面量语法 const b = [1, 1]
以上两种数组创建的方式都可能产生数组空位,例如:
const s1 = new Array(10)
上述虽然创建了一个长度为10的数组,但是在控制台打印的结果为:
(10) [empty × 10]
这里的empty就是数组中的空位,通常含有数组空位的数组称为稀疏数组,相反的,没有数组空位的数组称为密集数组。

那么数组空位会造成什么影响呢?
const s2 = s1.map(() => 1)
上述代码中,我们想通过map方法对s1进行遍历返回一个值全为1的数组,但是最终s2打印出来仍然是一个含有10个数组空位的数组。

而forEach(),filter(),every(),some()忽略数组空位的处理。
发表于 2021-08-28 08:22:51 回复(0)
// 选项A
let i1 = 1 + {
    valueOf() { return 9; }
};
// { valueOf() { return 9; } } 是一个匿名对象,该对象有一个名为valueOf的方法,对象与数字相加时,对象调用自身的valueOf方法转换为数字,故输出 i == 1 + 9 == 10;
// 当对象没有提供valueOf方法时,对象与数字都转换为字符串相加
// 1 + {} == '1[object Object]'
//选项B:
let i2 = 0;
new Array(10).forEach(() => {
    i2++;
});
//new Array(10)因为每一项都是undefined,所以forEach的时候被忽略了,如果定义数组时填充数值就会得到10
new Array(10).fill(1).forEach(() => { i2 ++ })
// 选项C:
16进制的oxA就是10进制的10
// 选项D:
let i3 = 5;
function a(i3) {
    i3 *= 2;
}
a(i3);
//永远记住js是值传递,计算的是形参,由于i3是基本数据类型,所以相当于a(5),计算完的结果没有保存,函数销毁。i3还是5
发表于 2021-03-02 17:30:16 回复(0)
new Array(10).forEach不会执行 
new Array(10).fill().forEach才会执行
最后选项如果方法不传参数i,结果才为10。
发表于 2020-05-01 21:02:15 回复(0)
A, C, B中的 forEach不能return, D函数没有返回值
编辑于 2019-08-18 11:33:27 回复(0)
forEach() 方法按升序为数组中含有效值的每一项执行一次 callback 函数,那些已删除或者未初始化的项将被跳过(例如在稀疏数组上)。
发表于 2022-04-13 10:02:52 回复(0)
对象(包括数组)会首先被转换为相应的基本类型值,如果返回的是非数字的基本类型值,则再遵循以上规则将其强制转换为数字。为了将值转换为相应的基本类型值,抽象操作ToPrimitive(参见ES5规范9.1节)会首先(通过内部操作DefaultValue,参见ES5规范8.12.8节)检查该值是否有valueOf()方法。如果有并且返回基本类型值,就使用该值进行强制类型转换。如果没有就使用toString()的返回值(如果存在)来进行强制类型转换。如果valueOf()和toString()均不返回基本类型值,会产生TypeError错误。
编辑于 2022-04-11 21:35:11 回复(0)
a选项: 怎么说呢就是 在尝试加法 乘法 之类的 会转换成原值,转换成原始值,又有两种模式: 偏字符串(首先调用tostring 如果不是原始值 会调用valueof),偏数值(首先调用valueof 如果不是原始值接着调用tostring)
发表于 2022-02-14 23:55:17 回复(1)
对象与基本数据类型相加,调用valueOf()方法;对象与基本类型判断相等,先调用toString()方法
发表于 2021-06-20 17:14:56 回复(0)