每日JavaScript - 1

本文深入探讨JavaScript中的常见问题,包括函数闭包、事件冒泡、数据类型区别、严格模式使用、数字整型检查、对象比较、变量作用域及私有化、字符串同态判断、代码转译原理及布尔表达式解析,旨在提升开发者对JavaScript核心概念的理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

用来集中我平常遇到的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!');
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值