JavaScript高级程序设计(第4版)学习随笔【第三章】
ECMAScript语法:
区分大小写
- 一切都区分大小写。无论是变量、函数名还是操作符都区分大小写
标识符(变量、函数、属性或函数参数的名称)
- 第一个字符必须是一个字母、下划线或美元符号$
- 剩下的其他字符可以是字母、下划线、美元符号或数字
- 标识符使用驼峰大小写形式,例如myCar
- 注意关键词不能作为标识符(如true、null等)
注释
- 单行注释
- 多行注释
严格模式
- 严格模式下,一些不规范的写法会被处理,抛出错误。
- 启用严格模式,需加上"use strict"(预处理指令)
语句
- 语句以分号结尾(没有分号也有效,但不推荐)
- 多行语句可以用{ }包裹起来,以{开始,以}结束(代码块)
if (test) {test = fasle;console.log(test);
}
- 关键字和保留字
- 变量
- ECMAScript变量是松散类型,可以用于保存任何类型数据(此处可去了解typeScript)
- 声明变量有三个关键词:var let const(后两者只有在ECMAScript6以后版本使用)
- var声明作用域
使用var操作符定义的变量会成为包含它的函数的局部变量,在函数退出时销毁
function test() {var a = 'hello world'
}
test()
console.log(a) // 出错// 省略var操作符定义全局变量 不推荐 局部作用域内定义全局变量很难维护
function test1() {b = 'hello world 1'
}
test()
console.log(b) // 'hello world 1'
var声明提升
var声明的变量会自动提升到函数作用域的顶部
例如上面代码不会报错,是因为var声明会被提升到函数作用域顶部,ECMAScript运行时把它看以下代码
不用var时
let声明
- let声明跟var差不多,最明显的区别是let声明范围是块作用域,var是函数作用域
- let声明跟var差不多,最明显的区别是let声明范围是块作用域,var是函数作用域
块作用域是函数作用域的子集,所限制var的也适用于let
let不能重复声明
let和var还有一个重要的区别,let声明在作用域中不会被提升。
全局声明
与var关键词不同,使用let在全局作用域中声明的变量不会成为window对象的属性(var会)
条件声明
let声明全局变量的时候,不确定同页面其他脚本有没有声明了同名变量,可用以下方式声明,可避免因重复声明而抛出错误。
for循环中的let声明
let出现之前,使用var声明,会渗透到循环体的外部
const声明
const和let基本相同,唯一一个重要区别是用const声明变量时必须同时初始化变量,且不能修改变量。(const声明的限制只适用于它指向的变量的引用)声明风格及最佳实践
- 尽量不使用var(行为怪异的var所造成的各种问题,已经让JavaScript社区为之苦恼了很多年)
- const优先,let次之
数据类型
- ECMAScript有6种简单数据类型(也称原始类型):Undefined、Null、Boolean、Number、String、Symbol。(Symbol是ECMAScript6新增的)
- 还有一种复杂数据类型叫Object(对象)【小菜叽发出疑惑:啊咧咧,奇怪,为 什么没有Array数组】
- typeof操作符(用于确定任意变量的数据类型)
Undefined类型(只有一个值,就是特殊值undefined),声明了变量未初始化就相当于给变量赋予了undefined值
Null类型,null值表示一个空对象指针(typeof null返回object,就是因为特殊值null被认为是一个对空对象的引用)
Boolean类型
Number类型
- 特殊数值NaN,意思是“不是数值”(No A Number)
- isNaN()函数 该函数接收一个参数 可判断该参数是否数值或是否能转换成数值
数值转换
有三个函数可将非数值转换为数值:Number()、parseInt()、parseFloat()
Number()函数转换字符串相对复杂且有点反常规,所以用parseInt()取整数,parseFloat()转换取小数。
String类型 字符串可以使用双引号(")、单引号(’)或反引号(`)标示
- 字符字面量:字符串数据类型包含一些字符字面量(用于表示非打印字符或其他用途的字符)
- 转义字符表示一个字符,所以只算一个字符,字符串中有双字节字符,那么返回的length可能不准确
- 字符串的特点 一旦创建 值就不能变了 要修改变量中某个字符串值,必须要先销毁原始字符串,再将新修改的字符串赋值给该变量(拼接字符串会比较慢的原因)
- 可用toString()将其他类型值转为字符串。
- 模板字面量
ECMAScript6新增使用模板字面量定义字符串的能力。
`用来定义HTML模板特别好用
字符串插值 `常量${变量}`
所有插入的值都会使用toString()强制转型为字符串模板字面量也支持定义标签函数,这个感兴趣可以搜一下看
Symbol类型
ECMAScript6新增类型。符号是原始值,且符号实例唯一、不可变的,用于确保对象属性使用唯一标识符,不会发生属性冲突
let genericSymbol = Symbol();
let otherGenericSymbol = Symbol();
let fooSymbol = Symbol('foo');
let otherFooSymbol = Symbol('foo');console.log(genericSymbol == otherGenericSymbol); // false console.log(fooSymbol == otherFooSymbol); // false
Symbol()函数不能与new关键词一起构造函数使用,避免创建符号包装对象。
Symbol还有很多深入的学习点,比如Symbol.asyncIterator等等,目前没想到使用场景,难理解一点,耗时多,暂放后面一点深入学习。(目前水平难以支撑 呜呜)
- Symbol.match用法 匹配字符串中是否含有某子串
- Symbol.replace用法 替换字符串中的子串
效果一样 有个小疑惑 为什么不直接用第二句 - 更多内容:Symbol.search 、Symbol.species 、Symbol.split 、Symbol.toPrimitive 、 Symbol.toStringTag 、 Symbol.unscopables(这个不推荐使用)
- Object类型
以前不太清楚toLocaleString()和toString()的区别,现在总算懂了一些
1、超过4位数字时toLocaleString()会增加逗号间隔,适合金额之类的数值
2、对时间的表示
对了别忘记了valueOf()
valueOf()对时间的处理等同于时间的getTime()
操作符
一元操作符(只操作一个值)
递增/递减操作符
++a (或a++)等价于 a = a + 1
–a (或a–)等价于 a = a - 1
(前缀优先级高,如–a + 2语句会先处理完–a再进行+2,而a-- + 2 会先处理a+2)一元加和减
位操作符(操作内存中表示数据的比特(位))
由于位操作是在数值的底层表示上完成的,所以速度快得多,有按位 非、按位与、按位或、按位异或、左移、有符号右移、无符号右移等。布尔操作符
1、逻辑非(!)
先将操作数转换成布尔值,再取反。
2、逻辑与(&&)
3、逻辑或(||)乘法操作符(*)
除法操作符(/)
取余操作符(%)
指数操作符(**)(es7新增 等价于 Math.pow())
加法操作符(+)不仅仅能处理数值的加,也可用于字符串拼接。
关系操作符(< 、>、<=、>=)
相等操作符
- == 等于 (强类型转换后对比)
- !== 不等于 (强类型转换后对比)
- === 全等 (不转换直接对比)
- !== 不全等 (不转换直接对比)
推荐使用全等和不全等
条件操作符(?)
let value = 1 > 2 ? true : false // false 三目运算
- 赋值操作符(=)
- 逗号操作符(,)声明多个变量
if语句
if(条件){符合条件}else{不符合条件}do-while语句
do{循环体}while(退出循环条件)while语句
while(满足循环条件){循环体}for语句
for(let i = 0; i < 10; i++) {循环体}for-in语句(适用于对象)
for(const a in b){枚举b所有的属性}
for-of语句(适合用于取值)
for(const a of b) {枚举b所有的属性}
区别:
ES2018还增加了for-await-of语句
break和continue语句
with语句(不推荐使用,严格模式下该语句会抛出错误)
针对一个对象反复操作,可缩减代码量
switch语句(如果表达式等于后面的值,则执行下面的语句)
switch(判断的值){
case 值1:
break;
case 值2:
break;
default: 默认走
break
}函数
function关键词声明
function aFun(参数) {执行语句} 那么aFun就是一个方法 通过函数名来调用方法小结
- ECMAScript中的基本数据类型包括Undefined、Null、Boolean、Number、String和Symbol。
JavaScript高级程序设计(第4版)学习随笔【第三章】相关推荐
- JavaScript高级程序设计第四版学习--第二十四章
title: JavaScript高级程序设计第四版学习–第二十四章 date: 2021-5-31 10:46:01 author: Xilong88 tags: JavaScript 本章内容: ...
- JavaScript高级程序设计红宝书学习笔记第三章基本概念
第三章 基本概念 本章内容 语法 数据类型 操作符 语句 函数 3.1 语法 3.1.1 区分大小写,ECMAScript中的一切(变量.函数名和操作符)都区分大小写. 3.1.2 标识符 标识符:变 ...
- JavaScript高级程序设计[第3版]
JavaScript高级程序设计[第3版] package xyz.huning.toolkit.pdf;import java.io.FileOutputStream; import java.io ...
- JavaScript高级程序设计 第4版----String
JavaScript高级程序设计 第4版----String 文章目录 JavaScript高级程序设计 第4版----String 1.JavaScript 字符 2.字符串操作方法 1.conca ...
- 阅读JavaScript高级程序设计(第二版)笔记
第一章js简介 JavaScript诞生在1995年,当时负责进行输入型验证. JavaScript是一种专为与网页交互而设计的脚本语言,分为 : 1. ECMAScript核心语言功能. 2.文档对 ...
- 《JavaScript高级程序设计 第3版》-学习笔记-1
P1-P30页 1.<script>标签的属性 async:async(html) | async="async"(xhtml),表示立即下载脚本,但不马上执行(执行 ...
- 新书-JavaScript高级程序设计:第2版(预订中,估价)
http://www.china-pub.com/196857 JavaScript的应用在广度和深度上日益扩大和加深,前端开发亟待掌握的JavaScript技能也越来越具有挑战性. 这个新版本几乎全 ...
- javascript 高级程序设计(第4版)阅读笔记(三)
第3章,内容很长,所以更得慢,主要讲的是ECMAScript es的语言基础:语法.数据类型.基本操作符.流控制语句.理解函数,ECMAScript 的语法很大程度上借鉴了 C 语言和其他类 C ...
- javascript高级程序设计第3版——第6章 面向对象的程序设计
第六章--面向对象的程序设计 这一章主要讲述了:面向对象的语言由于没有类/接口情况下工作的几种模式以及面向对象语言的继承: 模式:工厂模式,构造函数模式,原型模式 继承:原型式继承,寄生式继承,以及寄 ...
- JavaScript高级程序设计 第4版 -- 操作符
3.5 操作符 3.5.1一元操作符 前缀版: 变量的值会在语句被求值前改变 后缀版: 递增递减在语句被求值后才改变 let age = 29; let anotherAge = --age + 2; ...
最新文章
- 【ACM】连续出现的字符
- C++(STL):04---智能指针之weak_ptr
- 编码-京东实习笔试编程题-糖果问题-动态规划
- grep、sed命令使用记录
- Kaggle新手入门之路(完结)
- Unity下载文件一(www协程下载)
- 中国将在大连建立下一个硅谷
- (转)直击马云虞锋闭门对话,3小时谈透未来变革大势,定调千亿美元目标
- C# matlab中标准差计算方法
- 名利双收的公益创业,“汇新杯”响应时代召唤助力公益创业
- Oracle与MySQL的备份还原及密码修改等
- C语言中getch()、getche()、getc()、getchar()、gets()、fgetc()、fgets()的区别与使用
- fiddler--HTTP协议调试工具
- Spec2006使用说明
- 一文读懂背照式CMOS图像传感器
- 损耗的基础知识(中)
- html视频怎么转换成图片,WPS演示如何将图片转换成视频?
- 2012年5月编程语言排行榜:C再次位居第一 Java 占有率持续下降
- 利用opencv带你玩转人脸识别-中篇(人脸检测,检测多个,视频检测快速入门)
- 爱鸿森技术引进创新方法