文末
js前端的重头戏,值得花大部分时间学习。
推荐通过书籍学习,《 JavaScript 高级程序设计(第 4 版)》你值得拥有。整本书内容质量都很高,尤其是前十章语言基础部分,建议多读几遍。
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
另外,大推一个网上教程 现代 JavaScript 教程 ,文章深入浅出,很容易理解,上面的内容几乎都是重点,而且充分发挥了网上教程的时效性和资料链接。
学习资料在精不在多,二者结合,定能构建你的 JavaScript 知识体系。
面试本质也是考试,面试题就起到很好的考纲作用。想要取得优秀的面试成绩,刷面试题是必须的,除非你样样精通。
这是288页的前端面试题
可以采用异或来实现两个变量值的交换
let a = 1
let b = 2
a ^= b
b ^= a
a ^= b
console.log(a) // 2
console.log(b) // 1
- 取整
~~num
第十九问 你能准确的做出自增与自减的题目吗?
请回答:y
的值为?
var x = 1;
var y = x + ++x + 3 * (x = ++x + x + x++ + 1)
- x++ + 3;
console.log(y);
咱们来解剖一下这个长的要死的表达式:
第一个x值为1
第二个自增先加后用,x = 2
将 ++x + x + x++ + 1 的运算结果赋值给x
++x 先加后用,x = 3
x = 3
x++ 先用后加,x = 3
++x + x + x++ + 1 = 3 + 3 + 3 + 1 = 10
x++的后加,x = 4
将表达式的值赋给x,x由4变为10
x++ 先用后加,x = 10
此时所有的变量都已经求出
y = 1 + 2 + 3*10 + 10 + 3 = 46
x++,x最终值为11
第二十问 你知道new
运算符的有两种优先级吗?
MDN
对 new
操作符的描述中,语法是:
new constructor[([arguments])]
([arguments])
意味着可以缺省,会存在 new constructor(...args)
和 new constructor
两种模式,并且前者的优先级高于后者。更详细的优先级见下图:
这个知识点非常重要,只有区分开了 new
带参列表和不带参列表,才能准确并且透彻的理解下面这道面试题。
function Foo(){
getName = function(){ console.log(1); };
return this;
}
Foo.getName = function(){ console.log(2); };
Foo.prototype.getName = function(){ console.log(3); };
var getName = function(){ console.log(4); };
function getName(){ console.log(5) };
Foo.getName();
getName();
Foo().getName();
getName();
new Foo.getName();
new Foo().getName();
第二十一问:你知道toString()
的妙用吗?
- 可以转换数字的进制(
2-36
)
// 参数为要转换的进制
var a = 10;
a.toString(2) // “1010”
a.toString(8) // “12”
a.toString(16) // “a”
- 可以生成随机验证码
利用 toString
的进制转换,可生成随机验证码
Math.random().toString(36).substring(3,7) //生成四位数的随机验证码
- 判断数据类型
toString.call(()=>{}) // [object Function]
toString.call({}) // [object Object]
toString.call([]) // [object Array]
toString.call(‘’) // [object String]
toString.call(22) // [object Number]
toString.call(undefined) // [object undefined]
toString.call(null) // [object null]
toString.call(new Date) // [object Date]
toString.call(Math) // [object Math]
toString.call(window) // [object Window]
第二十二问:字符串是原始值,那为什么可以调用字符串方法那?
原始值是没有属性也没有方法的,那为什么字符串可以调用方法那?
JavaScript
为了便于基本类型操作,提供了三个特殊的引用类型(包装类),即 Number,String,Boolean
,它们的 [[PrimitiveValue]]
属性存储它们的本身值。
光说这些有可能有些难理解,咱们来举个例子:
var str = ‘zcxiaobao’
str2 = str.toUpperCase()
其实js引擎内部会这样处理:
var str = ‘zcxiaobao’
// 调用方法,创建String的一个实例
new String(str)
// 调用实例上的方法,并将值返回
str2 = new String(str).toUpperCase()
// 销毁实例
但这里有一个需要注意的点,new String('1')
和 '1'
类型相同吗,我们来测试一下:
var str1 = new String(‘1’);
var str2 = ‘1’;
console.log(str1 === str2); // false
console.log(str1 == str2); // true
console.log(typeof(str1)) // object
// new String()得到的字符串为object格式
第二十三问:修改string.length大小能改变字符串长度吗?为什么?
先看一个示例:
var str = ‘123456’;
str.length = 0;
console.log(str, str.length); // 123456 6
很明显,修改 str.length
是无法做到修改字符串的长度的。
原因跟第二十二问是相同的,str
为原始值,调用 length
相当用 new String(str).length
,修改的是 new String(str)
的 length
,跟原始值 str
无关。
第二十四问:修改new String()生成字符串的length会生效吗?为什么?
如果将上面代码修改一下,str
是由 new String
产生,修改 length
属性会生效吗?
var str = new String(‘123456’);
str.length = 0;
console.log(str, str.length); // String {“123456”} 6
答案告诉我们,还是失败了。
二十三问中:new String()
生成的字符串是对象类型,为啥还不能使用 length
属性。那说明 length
属性,很有可能配置了不可写,测试一下上述猜想:
Object.getOwnPropertyDescriptor(str, ‘length’)
/*
{
value: 6,
writable: false,
enumerable: false,
configurable: false
}
*/
由控制台的打印可知:new String()
生成的字符串的 length
属性不止是不可写,而且是不可枚举、不可配置的。
第二十五问:你知道如何给数字添加千分符吗?
千分符:每隔三位数加进一个逗号,也就是千位分隔符,以便更加容易认出数值。最经典的案例就是银行账单:
200,100,100.00
元。
- 调用字符串的
toLocaleString()
方法
var num = 1450068.12;
console.log(num.toLocaleString()) // 1,450,068.12
ES6
-
列举常用的ES6特性:
-
箭头函数需要注意哪些地方?
-
let、const、var
-
拓展:var方式定义的变量有什么样的bug?
-
Set数据结构
-
拓展:数组去重的方法
-
箭头函数this的指向。
-
手写ES6 class继承。
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
微信小程序
-
简单描述一下微信小程序的相关文件类型?
-
你是怎么封装微信小程序的数据请求?
-
有哪些参数传值的方法?
-
你使用过哪些方法,来提高微信小程序的应用速度?
-
小程序和原生App哪个好?
-
简述微信小程序原理?
-
分析微信小程序的优劣势
-
怎么解决小程序的异步请求问题?