前言
用来集中我平常遇到的JavaScript问题,或者是基本工具类的函数,或是JavaScript基础知识
1.
实现:
var addSix = createBase(6);
addSix(10); // returns 16
addSix(21); // returns 27
My answer
function createBase(num) {
let res = function(x) {
return x + num;
}
return res;
}
var addSix = createBase(6)
console.log(addSix(10))
2.请解释Null和Undefined
如果还没有被初始化,则是undefined;
如果不可用,则可以用null来表示
3."use strict"到底有何用处?
use strict放在文件的顶部或则函数的第一行来启动更加严格的检查来避免失误引起的错误。比如,下面的代码会抛出错误:
function doSomething(val) {
"use strict";
x = val + 10;
}
因为x没有定义,如果使用了use strict,x是不会被当做全局的变量来看待。下面的代码修复了这个BUG:
function doSomething(val) {
"use strict";
var x = val + 10;
}
4.请解释事件冒泡以及如何阻止它?
事件冒泡的概念是指:在最内层的元素上绑定的事件被触发后,会按照嵌套的层次由内向外逐步触发。因此,点击某个孩子节点可能会触发父节点的事件。
一个阻止事件冒泡的办法就是使用event.stopPropagation(),在IE<9的浏览器上使用event.cancelBubble()。
5. 如何检查一个数字是否是整数?
function isInt(num) {
return num % 1 === 0;
}
console.log(isInt(4)); // true
console.log(isInt(12.2)); // false
console.log(isInt(0.3)); // false
6.如果比较JavaScript中的两个对象?
var a = [1,2,3];
var b = [1,2,3];
var c = "1,2,3";
a == c; // true
b == c; // true
a == b; // false
7.解释undefined和not defined的区别加粗样式
undefined
var x;
console.log(x);
not defined
console.log(i);
8.在JavaScript中如何创建私有变量?
考虑函数作用域
function tell() {
let x = 1;
}
console.log(x); // not defined
通过闭包暴露接口,使得外面函数可以通过接口访问到私有变量
function tell () {
var x = 1
return {
getter: () => x,
setter: (y) => x = y
}
}
console.log(tell().getter())
console.log(tell().setter(2))
9.设计函数判断两个字符串是否同态?
同态是指一个字符串里面的字符都和另一字符串的字符一一对应
如 add - egg (同态) freedom - rainbow (不同态)
function diff(str) {
let res = '';
let len = str.length;
for (let i = 0; i < len; i++) {
if (!res.includes(str[i])) {
res = res + str[i];
}
}
return res;
}
function jugSame(str1, str2) {
let diff1 = diff(str1),
diff2 = diff(str2);
let len2 = str2.length;
let obj = {};
if (diff1.length !== diff2.length) return false;
for (let i = 0; i < diff1.length; i++) {
obj[diff1[i]] = diff2[i];
}
console.log(obj);
for (let e = 0; e < len2; e++) {
if (str2[e] !==obj[str1[e]]) return false;
}
return true;
}
console.log(jugSame('add', 'egg'));
console.log(jugSame('add', 'gge'));
console.log(jugSame('paper', 'title'));
此道题挺绕的,思路有点理不清,代码可以改进。
10.Transpiling代表了什么意思?
Transpiling是transforming + compiling的合成词。对于一些新的语法,浏览器还不支持。最好的办法就是将其变换到旧的等价的代码,这个过程通常叫做transpiling。
典型的,你可以在build的过程中加入transpiler,就如同code linter和minifier一样。
已经有很多知名的transpilers可供使用:
Babel: 将ES6编译到ES5
Traceur:将ES6,ES7等编译到ES5
11.在 JavaScript 中 (a ==1 && a== 2 && a==3) 可能为 true 吗?
当使用 == 时,如果两个参数的类型不一样,那么 JS 会尝试将其中一个的类型转换为和另一个相同。在这里左边对象,右边数字的情况下,会首先尝试调用 valueOf(如果可以调用的话)来将对象转换为数字,如果失败,再调用 toString。
const a = {
i: 1,
toString: function () {
return a.i++;
}
}
if(a == 1 && a == 2 && a == 3) {
console.log('Hello World!');
}