第三章 语言基础
1.1 语法
ECMAScript
的语法借鉴了C
语言和其他类C
语言,如Java
等
- 区分大小写,变量
a
与A
不同 - 标识符,变量名、函数名、参数名等一切你可以命名的东西的名称就是标识符,由字母、下划线(
_
)、$
开头,后续字符可以是以上加上数字
,关键字与保留字不能作为标识符 - 语句以分号(
;
)结尾,语句结束最好加上
推荐驼峰命名法,首字母小写,后面每个单词的首字母大写
不以
;
结尾有时不会报错,但代码规范最好加上
1.2 严格模式(推荐使用)
使用严格模式会更加严格检查代码,不规范的写法也序原本可以运行,但在严格模式下会报错,需要在脚本开头加上一串字符
"use strict";
也可也只对函数使用严格模式
function fuckingJs() {
"use strict";
console.log("卷心菜yst");
}
2.1 变量
js
的变量可以保存任何类型,可以是数字,字符,数组,对象等,有三个关键字可以声明变量
var
(最好不用)
函数内是是函数作用域范围,变量出函数死亡,全局内是全局作用域范围。变量声明会提升。同一个域可重复声明,因为提升时会合并为一个声明
//案例一 了解作用域
fuction a(){
var yst= "卷心菜";
}
console.log(yst); //报错,因为出了函数作用域
for(var i = 0;i < 3;i++){ //这里的for循环不是函数,所以 i 与 yst 都是全局的
var yst = i;
}
console.log(i); //3
console.log(yst); //2
//案例二 了解变量提升
var a = "卷心菜";
var a = "yst";
//以上代码等同于
var a;
a = "卷心菜";
a = "yst";
//案例三 了解作用域与变量提升
if(true){
var name = "卷心菜yst"; //这是一个全局变量,因为if(){}不是函数
}
console.log(name); //卷心菜yst
//以上代码等同于
var name;
if(true){
name = "卷心菜yst";
}
console.log(name); //卷心菜yst
需要注意的是函数式的
fuction
的声明也会提升,且在变量提升位置之前
需要注意的是全局作用域下用
var
声明的变量会成为window
对象的属性
let
(推荐使用)
块作用域范围,变量出花括号({}
)死亡。变量不会提升,所以变量声明之前不能使用,这块地方叫暂时性死区。同一个域内不能重复声明
{//这是一个块,也可以是if语句的块内,也可以是函数块内等
console.log("yst"); //报错,暂时性死区
let yst = '卷心菜";
console.log(yst); //卷心菜
}
console.log("yst"); //报错,作用域外
需要注意的是
let
与var
重名也会报错
const
(推荐使用)
与 let
基本一致,但是赋值后值无法改变,但是如果保存的是对象可以修改,因为保存的是对象地址,地址并没有被改变
const a = 1;
a = 2; // 报错,给常量重复赋值
const yst = {};
yst.name = '卷心菜'; // ok
需要注意的是在严格模式下,给一个没有声明的变量赋值
a = 1
,则会导致抛出ReferenceError
。
3.1 数据类型
js
有 6
种简单数据类型,数据直接存储在内存空间,与 1
种复杂数据类型object
对象类型
undefined
简单数据类型为空时推荐赋值为 undefined
,所有已经声明但是未被赋值的变量会默认赋值 undefined
函数没有返回值默认返回 undefined
null
对象数据类型为空时推荐赋值 null
boolean
值为 true
和 false
,区分大小写,True
和False
是标识符而不是布尔值
需要注意的是
boolean
类型的值 虽然只有true
与false
两个值,但是其他类型的值可以等价转换为boolean
类型,可以使用Boolean()
转型函数,也可也使用if()
语句自动转换
string
非空字符串为true
,空字符串为false
number
非0
为true
,0
或NaN
为false
object
任意对象为true
,null
空指针对象为false
undefined
都是false
string
字符串,可以使用双引号("
)、单引号('
)或反引号(``),是不可变的。一旦创建要修改只能开辟一块新空间销毁原来的
- 转换为字符串
有3
种方法可以转换为字符串value.toString()
转换null
与undefined
时报错value+""
这种方法的可读性很差String(value)
(推荐)
义字符只占一个字符长度
\n
number
数字,使用双精度浮点类型,相当于 java
中的 double
,不区分浮点型和整数型 ,可以使用 2
、8
、10
、16
进制,但是 8
进制在严格模式下会报错,由于精度问题会导致许多错误如 0.1+0.2!=0.3
2
进制0b
开头
8
进制0
开头
10
进制
16
进制0x
开头
Number.MIN_VALUE
与 Number.MAX_VALUE
保存 number
的最小最大值。 如果计算时超出范围返回 -infinity
与 +infinity
-
NaN
NaN
(not a number) 不是数值的数字类型 ,本应该返回数字,但是计算失败而返回不正确的数字返回值,使用typeof
也是返回number
-
转换为数字
有3
个函数可以将非数值转换为数值Number()
parseInt()
第二个参数确定为几进制parseInt("0xAF", 16);
parseFloat()
需要注意的时
NaN
进行任何运算都是返回NaN
,NaN
不等于任何值包括本身NaN != NaN
,判断是否是NaN
需要调用专门函数判断isNaN()
symbol
符号,无论如何不会重复,独一无二的值。,一般用于创建对象的键,不使用 new
关键字初始化,后续详细深入
const symbol = Symbol('描述') // Symbol(描述)描述可以不加
object
表示值为对象(而非函数)或 null
,推荐使用 let o = {}
初始化,key
可以也通常不加引号,除非时特殊符号
const yst= {
name: '卷心菜'
}
const obj = {
'@@': '卷心菜' // 正常
}
3.2 typeof
操作符
会返回操作值数据类型的字符
console.log(typeof 1); //1
需要注意的是
null
会返回object
字符,因为null
实际上对空对象的引用,函数会单独返回fuction
字符串,函数本来应该是object
类型,但是函数有自己的特殊性
已经声明但没有赋值,与未声明的变量有本质区别
对以上两种情况使用typeof
都是返回undefined
undefined
是一个假值,空字符串 ‘’ ,null
都是假值
undefined
由null
派生undefined == null
3.3 模板字面量(ES6
)
反向单引号 (``),可以声明跨行字符串,严格来讲它不是一个字符串声明模式,而是一个特殊的 JavaScript
表达式,返回值为一个字符串,并且在定义时立即求值并且转换为字符串实例
let yst = `
这是
跨行
`
模板字面量插值
在模板字面量中使用 ${}
,实际字符串返回时会计算该插槽中的表达式并且强制转换为字符串
let yst =`我是${1+2}`;//等同于
let yst ="我是"+(1+2);
标签函数
可以对模板字面量里的插值提取出来这次操作,比如把里面的变量再次提取出来变成可以点击的链接
let a = 6;
let b = 9;
function tagFunction(c,d,e,f){
console.log(c);
console.log(d);
console.log(e);
console.log(f);
}
let yst= tagFunction`${a} + ${b} = ${a+b}`;
//输出为
//[""," + "," = ",""]
//6
//9
//15
let book = [
{author:"yst"},
{author:"卷心菜"}
];
function template(){ //将模板里面的变量yst替换成为链接
return `<ul>
${book.map(item=>links`<li>作者:${item.author}</li>`)}
<ul>`;
}
function links(strings,...vars){
return strings.map((str,key)=>{
return str + (vars[key]?vars[key].replace("yst",`<a href="https://www.yst.com">卷心菜</a>`):"")
}).join("");//不然会以,作为分隔符
}
若使用 String.raw
作为模板字符串的前缀,则反斜线不再是特殊转义字符,\n
也不会被解释成换行符:
let raw =String.raw`Not a newline: \n`;
console.log(raw ==='Not a newline: \\n');// true
4.1 操作符
java
写法 ++ -- ^ ! = * / %
等等
5.1 语句
java
写法 if else do while for switch with
(with
严格模式报错) 等等
需要注意的是
for in
用于遍历对象for of
用于遍历集合
switch
里的等式是===
不会进行隐式转换
6.1 函数
java
写法,不需要指定是否返回值,可以省略 return
// 定义函数sayHi()
function sayHi(name, message) {
console.log("Hello " + name + ", " + message);
}
// 调用函数sayHi()
sayHi("Nicholas", "how are you today?");
严格模式下
不能以eval
或arguments
作为名称
参数不能叫eval
或arguments
两个命名参数不能拥有同一个名称