类型转换等 面试真题
题目1
请问哪个结果为NaN
A. 123+null
B. 123+‘1’
C. 123/0
D. 123+undefined
在这四个表达式中,只有D. 123 + undefined
的结果是 NaN
,原因如下:
A. 123 + null
- 结果是:
123
- 原因:
null
在数值运算中会被自动转换为0
,所以123 + null
相当于123 + 0
,结果是123
。
B. 123 + '1'
- 结果是:
'1231'
- 原因:
123
是数字,而'1'
是字符串,JavaScript 遇到数字和字符串进行加法运算时,会将数字转换为字符串,然后进行字符串拼接。因此结果是'1231'
(字符串)。
C. 123 / 0
- 结果是:
Infinity
- 原因:在 JavaScript 中,数字除以
0
会得到Infinity
。这不是NaN
,而是 JavaScript 特殊的无穷大值。
D. 123 + undefined
- 结果是:
NaN
- 原因:
undefined
在数值运算中无法被自动转换为有效的数值,因此结果是NaN
(Not a Number)。
总结:
- D.
123 + undefined
结果是NaN
。
题目2
[1,3,4,10,8,78,20].sort()
的结果
题目3
给你一个字符串,请你找出其中不含有重复字符的最长子串长度。给出js代码实现
function lengthOfLongestSubstring(s) {
let charIndexMap = {};
let start = 0;
let maxLength = 0;
for (let i = 0; i < s.length; i++) {
let char = s[i];
if (charIndexMap[char] !== undefined && charIndexMap[char] >= start) {
start = charIndexMap[char] + 1;
}
charIndexMap[char] = i;
maxLength = Math.max(maxLength, i - start + 1);
}
return maxLength;
}
// 测试代码
let testString = "abcabcbb";
console.log(lengthOfLongestSubstring(testString)); // 输出应该是 3
这个函数通过维护一个滑动窗口(start 到 i),并使用一个对象 charIndexMap 来记录字符最后出现的位置。如果遇到重复字符,就移动窗口的起始位置到重复字符上一次出现位置的下一个位置。每次迭代更新最长子串的长度 maxLength。对于给定的测试字符串 “abcabcbb”,最长不含重复字符的子串长度是 3(例如 “abc”)。
题目4
Es5中的类和s6中的class有什么区别?
ES5中的类和ES6中的class
关键字在实现面向对象编程方面存在一些关键的区别:
-
语法糖:
- ES6的
class
关键字提供了一种更简洁、更清晰的语法来定义类和继承,它被看作是ES5中构造函数和原型链操作的语法糖。 - ES5中使用构造函数和原型链来模拟类的行为,而ES6的
class
则直接提供了类的定义方式。
- ES6的
-
构造函数和原型链:
- 在ES5中,类是通过构造函数和原型链来实现的。构造函数用于创建对象实例,而原型链用于定义共享的方法和属性。
- ES6的
class
则允许直接在类体中定义方法和属性,而不需要显式地操作原型链。
-
继承:
- ES5中实现继承需要手动设置原型链,或者使用一些辅助函数如
Object.create
或call
方法。 - ES6引入了
extends
关键字来简化继承的实现,子类可以使用super
关键字来调用父类的构造函数或方法。
- ES5中实现继承需要手动设置原型链,或者使用一些辅助函数如
-
静态方法和属性:
- ES6的
class
允许使用static
关键字定义静态方法和属性,这些方法和属性属于类本身,而不是类的实例。 - 在ES5中,静态方法和属性需要手动添加到构造函数上。
- ES6的
-
new.target:
- ES6引入了
new.target
属性,它在构造函数中使用,用于确定函数是否是通过new
关键字调用的。 - ES5中没有直接的方式来检测函数是否是通过
new
调用的。
- ES6引入了
-
不存在变量提升:
- ES6的
class
声明不存在变量提升,这意味着类的声明必须在使用之前完成。 - ES5中的函数声明和变量声明存在提升现象。
- ES6的
-
简洁性和可读性:
- ES6的
class
语法更加简洁和直观,使得代码更易于理解和维护。 - ES5的实现方式较为复杂,需要对原型链和构造函数有较深的理解。
- ES6的
综上所述,ES6的class
关键字在语法上为JavaScript的面向对象编程提供了更为简洁和直观的实现方式,而ES5则需要通过构造函数和原型链来实现类似的功能。尽管ES6的class
在功能上与ES5的实现方式等效,但其引入的语法糖使得代码更加符合传统面向对象语言的风格。
题目5
给你一个整型数组numbers在数字中找出由三个数组成的最大乘积并输出这个乘积。给出js代码实现
在 JavaScript 中,要找出一个整型数组中由三个数字组成的最大乘积,可以通过以下步骤实现:
- 首先对数组进行排序。
- 最大的乘积要么是最大的三个数的乘积,要么是两个最小的数(可能为负数)和最大的数的乘积(如果数组中包含负数)。
以下是实现这一功能的 JavaScript 函数:
function maxProductOfThree(numbers) {
// 对数组进行排序
numbers.sort(function(a, b) { return a - b; });
// 最大乘积可能是最大的三个数的乘积,或者是两个最小数和最大数的乘积
return Math.max(numbers[0] * numbers[1] * numbers[numbers.length - 1], numbers[numbers.length - 1] * numbers[numbers.length - 2] * numbers[numbers.length - 3]);
}
// 示例使用
let numbers = [1, 10, 2, 6, 3, -1, -2];
console.log(maxProductOfThree(numbers)); // 输出应该是 180
在这个例子中,数组 [1, 10, 2, 6, 3, -1, -2]
的最大乘积由三个最大数 2 * 6 * 10
或者两个最小数 -2 * -1 * 10
组成,结果为 180
。