Javascript中var和let之间的区别

区别:
1、var有变量提升,而let没有;
2、let不允许在相同的作用域下重复声明,而var允许;
3、let没有暂时性死区问题;
4、let创建的全局变量没有给window设置对应的属性;
5、let会产生块级作用域,var不会。

想要了解var(ES5)和let(ES6)区别,首先就要了解ES5下JS的变量提升

一.变量提升(声)

当浏览器开辟出供代码执行的栈内存后,代码并没有自上而下立即执行,而是继续做了一些事情:把当前作用域中所有带var/function关键字的进行提前的声明和定义 => 变量提升机制

带var的只是提前声明(declare) var a;,如果只声明没有赋值,默认值是undefined
例如:

console.log(a);
var a = 13;

输出:undefined
相当于:

var a;      // 只声明没有赋值,默认为undefined
console.log(a);
a = 13;

带function的不仅声明,而且还定义了(defined),准确来说就是让变量和某个值进行关联。

二.let和var的区别

1. letconst 不存在变量提升机制. 创建变量的六种方式中:var/function有变量提升,而let/const/class/import都不存在这个机制

2. var允许重复声明,而let不允许重复声明.
在相同的作用域(或执行上下文中)
如果使用var/function关键词声明变量并且重复声明,是不会有影响的(声明第一次之后,之后再遇到就不会再重复声明了)
但使用let/const就不行,浏览器会校验当前作用域中是否已经存在这个变量了,如果已经存在了,则再次基于let等重新声明就会报错

在浏览器开辟栈内存供代码自上而下执行之前,不仅有变量提升的操作,还有很多其他的操作 => “词法解析”或者“词法检测”:就是检测当前即将要执行的代码是否会出现“语法错误 SyntaxError”,如果出现错误,代码将不会再执行(第一行都不会执行)

console.log(1)  // => 这行代码就已经不会执行了
let a = 12
console.log(a)
let a = 13      // => 此行出错:SyntaxError: Identifier 'a' has already been declared
console.log(a)

所谓重复就是:不管之前通过什么方法,只要当前栈内存中存在了这个变量,我们使用let/const等重复再声明这个变量就是语法错误。

console.log(a)
var a = 12
let a = 13  // => SyntaxError: Identifier 'a' has already been declared
console.log(a)
console.log(a)
let a = 13
var a = 12  // => SyntaxError: Identifier 'a' has already been declared
console.log(a)

3. let能解决typeof检测时出现的暂时性死区问题(let比var更严谨)

console.log(a)
// => ReferenceError: a is not defined

typeof a 未报错

console.log(typeof a)
// =>  'undefined' 这是浏览器的bug,本应报错,因为没有a(暂时性死区)

使用let后:

console.log(typeof a)
// => ReferenceError: Cannot access 'a' before initialization
let a

返回不能在a被定义之前使用它,解决暂时性死区问题。

4. let创建的全局变量没有给window设置对应的属性
首先看带var与不带var创建全局变量时的区别

/*
 * 不带var的:相当于给全局对象window设置了一个属性a
 *      window.a = 13
 */
a = 13
console.log(a)  // => window.a 13
/*
 * 栈内存变量存储空间
 *            b
 * 带var的:是在全局作用域下声明了一个变量b(全局变量),
 * 但是在全局下声明的变量也相当于给全局对象window增加了一个对应的
 * 属性b(只有全局作用域具备这个特点)
 */
var b = 14
console.log(b)
console.log(window.b)

在这里插入图片描述
在这里插入图片描述

使用let创建时:

/*
 * 栈内存变量存储空间
 *   c
 * 带let的:仅仅在全局作用域下声明了一个变量b(全局变量),
 * 并未给全局对象window增加对应的属性c
 */
let c = 15
console.log(c)                          // => 15
console.log(window.c)                   // => undefined

在这里插入图片描述
5. let会产生块级作用域
下面代码能否实现点击某个按钮,body的背景色改为按钮对应的颜色,若不能,如何改进(腾讯)

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0">
  <style>
    * {
      margin: 0;
      padding: 0;
    }

    html,
    body {
      height: 100%;
      overflow: hidden;
    }

    button {
      padding: 5px 10px;
      cursor: pointer;
    }
  </style>
</head>

<body>
<!---->
<button value="red"></button>
<button value="green">绿</button>
<button value="blue"></button>

<script>
  var body = document.querySelector(&#39;body&#39;),
    buttons = document.querySelectorAll(&#39;button&#39;),
    arr = [&#39;red&#39;, &#39;green&#39;, &#39;blue&#39;]
  for (var i = 0; i < buttons.length; i++) {
    buttons[i].onclick = function () {
      body.style.background = arr[i]
    }
  }
</script>
</body>
</html>

答案当然是不能,因为通过var定义的变量,在for循环中的i是全局的,变量提升、3次循环过后,i=3,因为点击每个都相当于点击最后一个。

参考:
javascript中var和let有什么区别

  • 10
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: JavaScript的split函数是用来将字符串分割成数组的方法。它可以根据指定的分隔符将字符串分割成多个子字符串,并将这些子字符串存储在一个数组。例如,可以使用split函数将一个以逗号分隔的字符串分割成多个子字符串,然后将这些子字符串存储在一个数组。split函数的语法如下: str.split(separator, limit) 其,separator是用来指定分隔符的字符串,可以是一个字符或多个字符的组合;limit是可选的参数,用来指定分割后的数组的最大长度。如果省略limit参数,则将分割后的所有子字符串都存储在数组。例如,下面的代码将一个以逗号分隔的字符串分割成多个子字符串,并将这些子字符串存储在一个数组var str = "apple,banana,orange"; var arr = str.split(","); console.log(arr); // ["apple", "banana", "orange"] 在这个例子,split函数将字符串"apple,banana,orange"分割成了三个子字符串"apple"、"banana"和"orange",并将这些子字符串存储在一个数组。 ### 回答2: JavaScript的split()函数是一个非常有用的方法,可以将字符串拆分成子字符串,并将它们存储在数组。它是一个字符串方法,可以用来从一个字符串提取子字符串,并将它们作为数组返回。使用split()函数有以下三种方式: 1. 使用指定分隔符拆分字符串 我们可以使用split()函数从一个字符串提取出所有的子字符串,并以指定的分隔符作为分隔符将其拆分成数组的元素。例如: ```javascript var str = "apple,banana,orange"; var arr = str.split(','); console.log(arr); // ['apple', 'banana', 'orange'] ``` 在上述代码,我们将逗号作为分隔符传递给了split()函数,这样就将字符串拆分成了一个包含三个元素的数组。需要注意的是,分隔符可以是任何字符,甚至是空格。 2. 使用正则表达式拆分字符串 split()函数还可以使用正则表达式作为分隔符进行字符串分割。例如: ```javascript var str = "apple/banana.orange"; var arr = str.split(/\/|\./); console.log(arr); // ['apple', 'banana', 'orange'] ``` 在上述代码,我们使用了一个包含正斜杆和点的正则表达式作为分隔符,split()函数可以根据正则表达式对字符串进行拆分,并将子字符串存储在数组。 3. 限制数组的长度 split()函数还可以带一个参数,用于限制拆分后的数组的长度。例如: ```javascript var str = "apple/banana.orange"; var arr = str.split(/\/|\./, 2); console.log(arr); // ['apple', 'banana'] ``` 在上述代码,我们将拆分后的数组长度限定为2,因此只会返回两个子字符串。如果我们将此参数设置为0,那么将返回包含整个字符串的数组。 最后需要注意的是,split()函数不会修改原始字符串,而是返回一个新的数组。 ### 回答3: JavaScript的split函数是字符串的一个方法,用于将一个字符串分割成一个数组。它需要一个参数,该参数告诉函数在哪里分割字符串。 该函数接受一个String类型的参数作为分隔符。如果分隔符是空字符串('')则分割字符串为每个字符,如果分隔符为Null会抛出InvalidArgument异常。它的调用方法如下: ``` string.split(separator) ``` 其,separator参数可以是字符串或正则表达式,它指定了分隔符。 例如: ``` const str = 'hello world'; const arr = str.split(' '); console.log(arr); // ["hello", "world"] ``` 在上面的例子,我们将字符串"hello world"分割为一个数组。按照空格分隔,得到了["hello", "world"]。 split()方法还可以添加第二个参数,表示限制输出数组的最大长度。如: ``` string.split(separator, limit) ``` 例如: ``` const str = "a,b,c,d,e"; const arr = str.split(",", 3); console.log(arr); // ["a", "b", "c"] ``` 在这个例子,我们将字符串"a,b,c,d,e"分成3个数组,因此输出数组的长度被限制为了3个。 总之,split()方法是一种非常有用的字符串操作方法,可以方便地将一个字符串拆分为一个数组。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值