理解ES6 (1) var, let, const 之间的区别 (2) 字符串和正则表达式

ES6知识点,面试题 Es6声明变量的六种方法 Var、function、let、const、import、class 2.var、let、cost的区别 作用域规则 Let/const声明的变量属于块级作用域,只能在其块或子块中可用。而var声明的变量的作用域是全局或者局部作用域 整个封闭函数 重复声明/重复赋值 var可以重复声明和重复赋值 let仅允许重复赋值,但不能重复声明 const既不可以重复声明,也不能重复赋值 变量提升(hosited) var声明的变量... 阅读详情

英文电子书点此阅读《understanding es6》

目录

block bindings

原先的 var

var 声明的变量会被提升到函数的顶部,如果不在函数中的话,就等于提升到全局的顶部。等于把var a = 1拆分成2部分,var a 和 a = 1,前者被提升。

let/const

es6中引进了let和const,需要注意的地方如下:

  1. block binding是指function或者{}。let 和 const 声明的变量不会提升,只在被声明之后才存在。在这之前变量处于时间死亡域中(tdz: temporal dead zone),甚至不能用貌似安全的操作符诸如typeof 来获取。
  2. let 和 const 在循环中与var不一样。for in 和 for of 都在每一次循环的iteration中生成了一个新的引用。因此,在循环体中生成的函数可以获取到当前迭代(interation)中的引用值,而不是循环之后的最终值。let在for循环中也是同理,但const不能用于for循环,因为改变了变量值。
  3. 用let或者const声明的变量,不能在该作用域下再次声明。let可以改变其值,const不能改变。const了就是常量了!
  4. 块级绑定的最佳实践是默认使用const,只在确定变量值需要改变的时候使用let。

const prevents modification of the binding, not modification of the bound value

已经看到有人翻译了这一章,戳这里阅读

Strings and Regular Expressions

用codePointAt来更好地unicode 支持

对超出了第一个2^16个代码点的Utf-16字符(即BMP,多语言基本面之外的字符),是不能用单个16位code unit表示的。对这些扩展字符集,会用2个code unit来表示。因此,用codePointAt()而不是charCodeAt()来按code unit的位置获取unicode 的 code point 值(就是一个整数),会更加准确,得到预期的结果

function is32Bit(c) {
    return c.codePointAt(0) > 0xFFFF;
}

console.log(is32Bit("?"));         // true
// 这个值可能显示不出来,可以用console.log(String.fromCodePoint(134071))来看


console.log(is32Bit("a"));          // false

16bit字符的上限在十六进制中用ffff来代表,因此,任何code point值大于这一数值的都是用两个code unit来代表的,是32位。

String类的normalize方法
在国际化的应用中尤为有用。在比较两个字符串时,应先采用同样的方式(nfc, nfd, nfkc, nfkd)将其标准化后,再进行比较。默认的标准化形式是nfc。
let values = [str1, str2] //自己定义两个字符串用于比较
values.sort(function(first, second) {
    var firstNormalized = first.normalize("NFD"),
        secondNormalized = second.normalize("NFD");

    if (firstNormalized < secondNormalized) {
        return -1;
    } else if (firstNormalized === secondNormalized) {
        return 0;
    } else {
        return 1;
    }
});	
正则表达式中的 u 标志

正则表达式假定单个字符使用一个 16 位的码元来表示。在正则中加入u标志后,将以字符为基准而不是code单位(16位或32位)为基准来判断。u的含义是unicode。

只要是一个字符的string, 不管是16位还是32位(看Length,不管是1还是2),都可以用 /^.$/u.test(str)来校验。

var text = "𠮷";

console.log(text.length);           // 2
console.log(/^.$/.test(text));      // false
console.log(/^.$/u.test(text));     // true

也可以轻松地利用/u来获取字符串以字符为基准的长度:

function codePointLength(text) {
    var result = text.match(/[\s\S]/gu);
    return result ? result.length : 0;
}
// 这么做的速度较慢,尤其是应用于长字符串时。应当尽量减少这么做的可能,考虑用字符串迭代器(iterator)来代替

other string changes
  • 子字符串 return true/false

    1. includes()
    2. startsWith()
    3. endsWith()

    两个参数:搜索的字符串(不支持正则),和起始搜索下标(非必要,如果不传实质default为0)
    对 endsWith,是从字符串的长度减去第二个参数开始匹配

  • repeat() 方法

    'abc'.repeat(2)  //'abcabc'
    
    //应用在缩进级别中:
    
    var indent = ''.repeat(4),
    	indentLevel = 0;
    
    var newIndet = indent.repeat(++indentLevel);
    
    
other regular expression changes
  • y flag, which is short for sticky

    /y表示从正则表达式的 lastIndex 属性值的位置开始检索字符串中的匹配字符。

    对不加flag的正则表达式,pattern的lastIndex值无影响
    对有global flag的正则表达式,当pattern 的lastIndex 属性设置为某个值n时,正则表达式会从n开始全局匹配。
    对有y flag的正则表达式,其sticky属性会被设置为true,从lastIndex开始尝试匹配(但不是全局匹配)

    sticky flag会在正则表达式中保存最近一次匹配的后一位下标。如果没有任何匹配,lastIndex则会被设置为0.全局的’g’ flag 同理。

    y flag 和 u flag 都是新语法,可用try catch 包裹以防止报错。

复制正则表达式
var re1 = /ab/i,re2 = new RegExp(re1);

re1 === re2 //false

typeof re1 //"object"

es6 中,可以加入第二个参数flag符,用来覆盖掉原有的flags。注意是覆盖不是新增。

var re1 = /ab/i,
    // throws an error in ES5, okay in ES6
re2 = new RegExp(re1, "g");
flags 属性

re 的 flags 属性可以提取flag

var re = /ab/g;

console.log(re.source);     // "ab"
console.log(re.flags);      // "g"
模板字符串

这个是重头戏了,挑一些平时不太注意的细节讲讲吧。

多行文字中要注意新行之前的空格也被计入字符串的一部分,如果需要缩进的话,可以在字符串后用上trim()方法

  • tagged templates
let count = 10,
    price = 0.25,
    message = passthru`${count} items cost $${(count * price).toFixed(2)}.`;

function passthru(literals,...substitutions){
	console.log(arguments);  //Arguments(3) [Array(3), 10, "2.50"] 展开array(3)是["", " items cost $", ".", raw: Array(3)]
	
	console.log('substitutions',substitutions);  //substitutions (2) [10, "2.50"]
	
	return literals.join('***')  
}

// message 的 值为 "*** items cost $***."

注意:

  1. literals的length永远比substitutions的多一个
  2. substitutions不一定是string,也可能是number
  • String.raw()

内置的String.raw() tag 可以避免字符转义,另外literals数组中也有raw属性,literals.raw是原字符串数组(未被转义)

let message1 = `Multiline\nstring`,
    message2 = String.raw`Multiline\nstring`;

console.log(message1);          // "Multiline
                                //  string"
console.log(message2);          // "Multiline\\nstring"

function raw(literals, ...substitutions) {
    let result = "";

    // run the loop only for the substitution count
    for (let i = 0; i < substitutions.length; i++) {
        result += literals.raw[i];      // use raw values instead
        result += substitutions[i];
    }

    // add the last literal
    result += literals.raw[literals.length - 1];

    return result;
}

let message = raw`Multiline\nstring`;

console.log(message);           // "Multiline\\nstring"
console.log(message.length);    // 17

summary

完备的unicode 支持让jaascript可以从逻辑上处理utf-16字符。code point 和 字符(character)之间可以通过 codePointAt() 和 String.fromCodePoint() 转换。新增的u字符让基于code points而不是基于16位字符处理成为可能。normalize()方法可以更适当地比较字符串。

includes, startsWith, endsWith 方法可以直接用true/false 来判断是否包含子字符串。

模板字符串可以方便地创建dsls(领域专用语言,domain-specific languages)。它支持变量代入和多行。template tags 尤其适用于创建dsls。

用Python实现四叉树(quad tree) import numpy as np #正方形类 class square: #lx、ly为左上角坐标(x对应行号,y对应列号),rx、ry为右下角坐标 def __init__(self,lx,ly,rx,ry): self.lx=lx self.ly=ly self.rx=rx self.ry=ry #检查该矩阵中是否满足条件 #参数:原矩阵,阈值 #返回值:布尔类型 def check(s 阅读详情

相关推荐

国标GB28181视频平台EasyGBS国标平台设备播放断流现象的问题解决方案

于是排查代码发现,当设备网络较差时,设备会断流,超过指定的时间30s(EasyGBS平台默认值),就会主动清除流媒体服务,但是redis中的流数据还在,而当设备在录像时,自动保活会从redis中取保活流数据,所以就会出现设备状态显示正在播放,但是流已经消失的情况。有用户反馈,在安防视频监控EasyGBS运行时,接入的设备刚开始可以正常播放,开启云端录像后,也没有停止和重播的操作,但是出现了视频流断流的现象。在设备进行播放保活时,对流信息进行判断,添加一个最后的处理流时间,如果超过指定时间就自动重新拉流。

EasyNTS的博客 433

let const var的区别

而使用let声明变量时,会形成块级作用域,每次循环会为变量i创建一个新的作用域,因此setTimeout函数中的回调函数会在各自的作用域中访问到不同的变量i,输出不同的结果。因此输出的结果都是6。虽然定时器的延时时间是100毫秒,但是由于JavaScript是单线程执行的,for循环中的代码会在主线程中立即执行完毕,因此会立即输出0~5的结果。虽然定时器的延时时间是100毫秒,但是由于JavaScript是单线程执行的,for循环中的代码会在主线程中立即执行完毕,因此会立即输出6个6的结果。

qq_43799531的博客 232

[漏洞利用]利用五次Shift越权破解win7\win10开机密码

注:第一个学习和接触的Windows漏洞 文章目录本机实验环境前置知识漏洞原理漏洞介绍漏洞验证解决方法基本流程介绍详细步骤截图 本机实验环境 虚拟机:VMware Workstation 14 pro 操作系统:Windows10 前置知识 1、cmd工具路径 c:\windows\system32\cmd,按五次shift默认调用同目录下sethc文件,其路径为“c:\windows\system32\sethc.exe” 2、用户/账户密码存储位置 c:\windows\system32\config\

Y4tacker的博客 2万+

let var const 的区别

let var const 的区别

qq_39296854的博客 140

Grok 3国内怎么用?超详细使用指南+实用指令模板

主要是用于快速分析学术论文,提取关键信息,总结研究成果。Analyze the following research paper: [粘贴或上传论文内容]1. Extract key findings, methodologies, and conclusions. (提取主要发现、方法和结论。2. Identify statistical significance and data points. (识别统计显著性和数据点。

Survivor_sl的博客 1万+

【Web实战】微信小程序逆向

2E 70 6E 67”为带存放路径的文件名称,“00 00 11 7C”对应文件在小程序包中的具体偏移位置,“00 01 01 F7“对应文件在小程序包中的数据长度。但这并不是最初的原项目文件结构,原因是微信服务器会将小程序源码中所有的“js”文件压入“app-service.js”文件中,将所有的“json”文件压入“app-config.json”中,将所有的“wxml”文件压入“page-frame.html”文件中,“wxss”则在处理之后以“html”文件的形式存留在对应页面目录之下。

若有战,召必回 1941

var,let和const的区别

一,在es6出现之前,JavaScript中声明变量的时候只有通过var 关键字,函数声明是通过function关键字,而在es6后,声明变量的方式多了2中(let,const,function,class,var,现在我们要讨论的是var,let和const的区别 二,var 之前我们在写js代码的时候都知道可以用var定义全局变量和局部变量,也可以省略var,而且在非严格模式下不会报错,但是实际上在严格模式下,两者的使用有没有区别,可能很多人不清楚。 varx=1;y=2; ...

qwerwjs的博客 260

SAP SD 顾问面试问题 consultant interview questionnaire

以下是我个人目前面试团队 SD顾问问题的小结,希望对大家有所帮助, 也可能有回答错误的地方,希望同行不吝赐教。 也希望各位顾问们讲你们遇到的一些面试问题做个跟贴,方便大家共同进步,谢谢。   面试问题清单:  一、销售订单类型影响: 可用性检查,交货类型,输出,信贷,定价,需求,报表,合作伙伴,文本,不完整日志,交货开票,订单开票,公司间开票,统计组,屏幕顺序组,参数文件...

weixin_33825683的博客 1807

let、const和var的区别(涉及块级作用域)

let 、const和var的区别 let、const、var在js中都是用于声明变量的,在没有进行ES6的学习前,我基本只会使用到var关键字进行变量的声明,但在了解了ES6之后就涉及到了块级作用域以及let,const了。 let与const let是用于替代var来声明变量(var是ES6之前用来声明变量的关键词) const是用来声明常量的(var,let声明变量时,变量一旦初始化之后,还可以重新赋值,const声明常量,一旦初始化,就不能重新赋值了,否则会报错) const详细介绍 使用con

qq_46883835的博客 2万+

逻辑判断1-逻辑基础知识

判断推理学习笔记

小y的学习笔记 2130

【WRF-Chem Emissions教程第一期】WRF-Chem 排放概述

WRF-Chem 排放概述

WW、forever的博客 852

ES6 标准之 let、const 详解

ES6 为JavaScript带来了许多强大的新特性,使开发者能够编写更加简洁、清晰和高效的代码。let和const作为新的变量声明方式,提供了更严格的作用域控制和不可变性,有助于减少错误和提高代码质量。

修己xj的博客 1603

OGRE 3D----2. QGRE + QQuickView

将 OGRE(面向对象图形渲染引擎)集成到使用 QQuickView 的 Qt Quick 应用程序中,可以在现代灵活的 UI 框架中提供强大的 3D 渲染功能。本文将指导您如何在 QQuickView 环境中设置 OGRE。

charce_you的专栏 913

var let const之间的特点及区别

其实 let 也存在与 var 类似的“变量提升”过程,但与 var 不同的是其在执行上下文的创建阶段,只会创建变量而不会被初始化(undefined),并且 ES6 规定了其初始化过程是在执行上下文的执行阶段(即直到它们的定义被执行时才初始化),使用未被初始化的变量将会报错。而所有使用 var 声明的变量都会在执行上下文的创建阶段时作为变量对象的属性被创建并初始化,这样才能保证在执行阶段能通过标识符在变量对象里找到对应变量进行赋值操作等。一个执行上下文的生命周期可以分为三个阶段:创建、执行、释放。

2301_81453175的博客 961

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

var、let、const之间的区别

目录变量varvar声明作用域变量提升let暂时性死区块级作用域for循环中的let声明const区别总结 变量 ECMAScript变量是松散类型的,也就是说变量可以用于保存任何类型的数据,每个变量只不过是一个用于保存任意值的命名占位符。 有三个关键字可以声明变量:var let const,var在ECMAScript的所有版本中都可以使用,let和const只能在ECMAScript6及更晚的版本中使用。 var var message; 这段代码声明了一个名为message的变量,可以用来保存任何

m0_52942098的博客 1742

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

【JS-6-ES6中的let和const】深入理解ES6中的let和const:块级作用域与变量声明的新范式

摘要:ES6引入的let和const解决了var的诸多问题,如函数作用域、变量提升和重复声明等。let提供块级作用域和暂时性死区,适用于需要重新赋值的变量;const用于声明不可变的常量,但对对象内容修改不受限制。两者都不存在变量提升,且禁止重复声明。现代JS开发建议优先使用const,必要时用let,避免使用var。这些改进使变量管理更安全可靠,成为JS语言设计的重要进步。

weixin_39033358的博客 979

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

let const var 之间的区别

let const 均为ES6新增语法,首先看看它俩之间的异同点一 . let与const相同点1.声明的变量只能在块级作用域有效;{ let a = 10; var b = 1; } a // ReferenceError: a is not defined. b // 12.不存在变量提升;// var 的情况 console.log(foo); // 输出undefined var...

dream19921216的博客 1415

【ES6】let、var和const的区别

一直没有好好地学习ES6,最近准备从头到尾撸一遍,记录一下自己的心得。 前言: ES5中声明变量只有两种方式:var 和function,在ES6中新增了let和const方式。它们都是去定义一个变量,当然不同的方式含义也不同。 一、const const的中文含义是恒定的,这里你可以理解为const定义一个变量之后,它的值不可改变(这个说法不准确,后面会说到)。因为不可修改,所以声明时必须赋初始...

qq_40060547的博客 240

【ES6新语法】let、const、var的区别,你学会了面试官没话说(1)

2.3 let、const、var 的区别(★★★)使用 var 声明的变量,其作用域为该语句所在的函数内,且存在变量提升现象使用 let 声明的变量,其作用域为该语句所在的代码块内,不存在变量提升使用 const 声明的是常量,在后面出现的代码中不能再修改该常量的值2.4 解构赋值(★★★)ES6中允许从数组中提取值,按照对应位置,对变量赋值,对象也可以实现解构。

2301_82243603的博客 741

let var const区别

(1).在ES6中我们使用includes()方法来判断数组中是否包含某个值,语法格式为arr.includes(value,index),其中value是必选参数,表示需要查找的值,index是可选参数,表示从哪个元素下标开始查找,默认为0。(1).padStart(),语法格式为str.padStart(len,str),在头部进行补全,len是必选参数,用于指定字符串长度,str可选,表示用来补全的字符串,省略则表示使用空格来补全。如果都满足,则返回true,如果有一个不满足,则返回false。

kun_sl的博客 922

es6 let和const的用法及注意事项

es6 let和const的相同点、不同点及注意事项相同点:都只能作用于当前代码块,没有变量提升不同点:letconst 今天又回顾了一下es6,发现let和const还有很多小细节没有注意到,写一篇文章来记一下。 相同点:都只能作用于当前代码块,没有变量提升 不同点: let let是定义变量,用法跟var相同,但是只能作用于当前代码块且没有变量提升。 function test(){ let...

Z.Y.的博客 1370

ES6新增语法 var 、let 、 const的区别

要定义变量,可以使用var操作符(注意var是一个关键字),后跟变量名,用他也可以保存任何类型的值。 上面 name被定义为一个保存字符串值的likeqin的变量,只是一个简单的赋值,可以改变值也可以改变值的类型,如下: 1.var 声明作用域 使用var操作符定义的变量会成为包含它的函数的局部变量,比如使用var在一个函数内部定义一个变量,那么该变量在函数退出时被销毁。例如: 上面这个name变量是在函数内部使用var定义的 函数叫test(),调用它 会创建这个变量并给它赋值。调用之

jj16165858的博客 313

如何用 es5 写 const 和 let

前言 无意逛某论坛,看到某位博主当面试官的经历,说是准备一道简单的面试题,可是面试者几乎没有一个答出来的。我看了下。便是如何用 es5 的方式实现一个 const。我也懵逼了,我去面试肯定也是答不出来的。仔细一想不禁觉得这个题目很妙,于是整理一下如何用 es5 实现一个 const 和 let 实现 let let 大家应该用的非常熟悉了,定义一个仅作用于该代码块的变量。首先想到的是去 babe...

weixin_34150224的博客 3299

es6(一)——var和let和const的区别

es6中var和let和const的区别

weixin_44784401的博客 310

用实例说明 var、let、const 的区别和特性

用实例说明 var、let、const 的区别和特性 写了这么就居然发现没写一篇关于 let 和 const 的…从今天开始全方位的进军 es6,哈哈啊哈哈哈 首先回顾一下 es5 var 的特性和作用域。var 命令可以声明一个变量,声明的变量和函数会有变量提升。例如: console.log(a); // undefined var a = 10; console.log(foo); ...

hello,是翠花呀 365

ES6中let和const命令

ES6中let和const命令 let命令 ES6中新增了 let 命令,用于声明变量,关于let有以下几个特点: 1 用法类似于var,但是所声明的变量只在 let 命令所在的代码块内有效,实现了块级作用域且不会污染全局变量。 2 不存在变量提升 3 暂时性死区 4 同一个变量在相同作用域内不允许重复声明 下面围绕这四个特点进行详细的分析 let 的基本用法 let声明的变量与var不用的是,l...

zsl15039718107的博客 774
上一篇: 利用ES6 的generators 化异步为同步
下一篇: 微信JS-SDK分享功能 填坑全纪录
十方魔
博客等级 码龄10年 202粉丝 93原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值