JS基础语法与表达式
JS基础语法与表达式
ECMAScript是JavaScript的标准
1997年,欧洲计算机制造商协会(ECMA)设置了JavaScript的标准,命名为ECMAScript
JavaScript的书写位置
在<body>中<script>标签,在内部书写JavaScript代码
将代码单独保存为.js格式文件,然后在HTML文件中使用<script src=""></script>这样的形式引入它
JavaScript不能脱离HTML网页运行(NodeJS将成为JavaScript独立的运行平台)
输出语句
alert()语句,弹出警告框
console.log()语句,控制台输出
变量
声明变量
var a = 5;
变量的合法命名:
只能由字母、数字、下划线、$组成,但不能以数字开头
不能关键字或保留字
变量名大小写敏感,a和A两个不同的变量
这些规则就是标识符的命名规则,函数、类名、对象的属性等也都要遵守这个命名规则。
一个变量只定义,但没有赋初始值,默认值是undefined
一个变量只有被var定义,并赋初始值之后,才算正式初始化完成
如果不用var定义,而直接将值赋予它,虽不引发报错,但会产生作用于问题。
使用逗号同时声明和初始化两个变量
var a = 0, b = 0;
变量声明提升
你可以提前使用一个稍后才声明的变量,而不会引发异常
在执行所有代码前,JS有预解析阶段,会预读所有变量的定义
变量声明提升只提升定义,不提升值
变量声明提升是提升至当前作用域的所有语句之前
数据类型
JS中的两大类数据类型
- 基本数据类型
- Number
- String
- Boolean
- Undefined
- Null
- 复杂数据类型
- Object
- Array
- Function
- RegExp
- Date
- Map
- Set
- 等等
typeof运算符
使用typeof运算符可以检测值或者变量的类型
Number
所有数字不分大小、不分整浮、不分正负,都是数字类型
小数中0可以省略
科学计数法
var a = 3e8;// 300000000 var b = 2e-4; //0.0002
不同进制的数字
二进制数值以0b开头, 0b10 => 2
八进制数值以0开头,017 => 15
十六进制以0x开头,0xf => 15
一个特殊的数字型值Nan
NaN(not a number),即“不是一个数”,但它是一个数字类型的值
typeof NaN; //number
0除以0的结果是NaN,事实上,在数学运算中,若结果不能得到数字,其结果往往都是NaN
NaN有一个奇怪的性质,不自等
String
加号可以用来拼接多个字符串
‘a’+‘b’ // 'ab'
字符串的length属性表示字符串的长度
字符串常用的方法
- charAt() 获取指定位置字符串
- substring() 提取子串
- substr() 提取子串
- slice() 提取子串
- toUpperCase() 将字符串变为大写
- toLowerCase() 见字符串变为小写
- indexOf() 检索字符串
charAt(index)方法得到指定位置字符,位置从0开始 substring(a,b)方法得到从a开始到b结束(不包括b处)的子串,如果省略第二个参数,返回的子串会一直到字符串结尾。a可以大于b,数字顺序将自动调整为小数在前
substr(a,b)方法得到从a开始的长度为b的子串,b可以省略,表示到字符串结尾,a可以是负数,表示倒数位置(倒数位置从-1开始)
slice(a,b)方法得到从a开始到b结束(不包括b处)的子串,参数a可以是负数,参数a必须小于参数b
indexOf()方法返回某个指定的字符串值在字符串中首次出现的位置,如果没有出现,则返回-1
boolean
布尔类型
Undefined
一个没有被赋值的变量的默认值是undefined,而undefined的类型也是undefined
即: undefined又是值,又是一种类型,这种类型只有它自己一个值
Null
null表示空,它是空对象
当我们需要将对象销毁、数组销毁或者删除事件监听时,通常将他们设置为null
用typeof检测null值,结果是object
数据类型的转换
其他值 -> 数字
使用Number()函数,纯数字字符串能变为数字,不是纯数字的字符串将转为NaN。布尔值真为1,假为0。
Number('123'); //123 Number('abc'); // NaN Number(''); //0 Number(' '); //0
Number(true); //1 Number(false); //0
Number(undefined); //NaN Number(null); //0
parseInt()函数的功能是将字符串转为整数,该函数会自动截掉第一个非数字字符之后的所有字符。其中.也是一个非数字字符,如果字符串不是以数字开头的,则转为NaN
parseInt(‘2.11’); //2 parseInt('3.14是圆周率'); //3 parseInt(‘圆周率是3.14’); //NaN parseInt('3.99'); // 3
parseFloat()函数的功能是将字符串转为浮点数
parseFloat(‘2.11’); //2.11 parseFloat('3.14是圆周率'); //3.14 parseFloat(‘圆周率是3.14’); //NaN parseFloat('3.99'); // 3.99 parseFloat(true); //NaN parseFloat(false); //Nan
其他值 -> 字符串
使用String()函数,数字转为字符串时,变为‘长得相同’的字符串,科学计数法和非10进制数字会转为10进制的值
String(123); // '124' String(123.4); // '123.4' String(2e3); // '2000' String(NaN); // 'NaN' String(Infinity); // 'Infinity' String(0xf); // '15'
String(true); // 'true' String(false); // 'false'
String(indefined); // 'undefined' String(null); // 'null'
使用toString()方法,几乎所有值都有toString()方法
其他值 -> 布尔值
使用Boolean()函数,数值类型转为布尔值时,0和NaN转为false,其他数字都转为true。空字符串转为false,其他都转为true。undefined和null转为fasle
Boolean(123); // true Boolean(0); // false Boolean(NaN); // false Boolean(Infinity); // true Boolean(-Infinity); // true
Boolean(''); // false Boolean('abc'); // true Boolean('false'); // true
Boolean(undefined); // false Boolean(null); // false
小测试:使用prompt()接收参数,编写一个计算器程序
复杂数据类型
复杂数据类型都是“引用类型”
表达式和运算符
表达式种类
- 算术
- 关系
- 逻辑
- 赋值
- 综合
算术运算符
- 加 +
- 减 -
- 乘 *
- 除 /
- 取余 %
隐式类型转换
如果参与数学运算的某操作数不是数字型,那么JavaScript会自动将此操作数转为数字型。除了加号,有连接操作符含义。 隐式转换的本质是内部调用Number()函数
3 * '4'; //12 true + true; //2 false + 2; //2 3 * '2day'; //NaN 3 + undefined; //NaN
有关IEEE754
在JavaScript中,有些小数的数学运算不是很精准
0.1 + 0.2; //0.30000000000000004
JavaScript使用了IEEE754二进制浮点算术标准,这会使一些个别的小数运算产生“精度丢失”问题
IEEE754二进制浮点数算术标准是计算机底层编译标准
解决办法:在进行小数运算时,要调用数学的toFixed()方法保留指定的小数位数
幂和开根号
JS中没有提供幂计算和开根号的运算符,需要使用Math对象的相关方法进行计算。
Math.pow(2,3); //2的3次方 Math.sqrt(81); //81根号运算9
向上取整和向下取整
Math.ceil(2.4); //向上取整 3 Math.floor(2.4); //向下取整 2 Math.ceil(-2.4); //2 Math.floor(-2.5); //-3
关系运算符
- 大于 >
- 小于 <
- 大于或等于 >=
- 小于或等于 <=
- 等于 ==
- 不等于 !=
- 全等于 ===
- 全不等于 !===
相等和全等
两个等号==运算符不比较值的类型,它会进行隐式转换后比较值是否相等
三个等号===运算符,不仅比较值是否相同,也比较类型是否相同
5 == '5'; //true 5 === '5'; //false
1 == true; //true 1 === true; //false
0 == false; //true 0 === false; //false
0 == undefined; //false 0 === undefined; //false
undefined == null; //true undefined === null; //false
NaN == NaN; //false NaN === NaN; //false
null和undefined用==比较涉及隐式强制转换,ES5规范中规定
- 如果x为null,y为undefined,则结果为true
- 如果x为undefined,y为null,则结果为true
null和undefined用===比较结果为false,因为类型不同
- typeof null -> object
- typeof undefined -> undefined
NaN不自等,isNaN()函数可以用来判断变量值是否为NaN,但isNaN()也不好用,它的机理是:只要该变量传入Number()的执行结果是NaN,则isNaN函数都会得到true。
isNaN(undefined); //true isNaN('3天'); //true isNaN(null); //false
不相等和不全等
!= 表示不相等,!==表示不全等
JS中没有连比
判断a是否介于3到15之间
逻辑表达式
- 非 !
- 与 &&
- 或 ||
非运算符
!true //false !false //true !0 //true !undefined //true !'' //true !'hell' //false
!!true //true !!false //false !!0 //false !!'' //false !!'hello' //true
可以使用两个!!查看某个的值是正性还是假性
短路计算
a && b运算中:a真,表达式值为b;a假,表达式为a
3 && 6 //6 6 && 3 //3 undefined && 3 //undefined 15 && undefined //undefined null && 2 //null '' && 16 //'' NaN && undefined //NaN
a || b运算中:a真,表达式值为a;a假表达式值为b
3 || 6 //3 6 || 3 //6 0 || 3 //3 null || undefined //undefined 'a' || 'b' //'a' NaN || null //null
逻辑运算顺序
逻辑运算的优先级是:非 -> 与 -> 或
赋值运算符
- 赋值 =
- 快捷赋值
- +=
- -=
- *=
- /=
- %=
- 自增 ++
- 自减 --
赋值运算也产生值,等号后面的值将作为“赋值运算的值”
var a; console.log(a = 4); //4
这就意味着,可以连续使用赋值运算符
var a, b, c; a = b = c = 15;
自增和自减
a++ 先用再加,++a先加在用
var a = 3; var b = a++; console.log(a); //4 console.log(b); //3
var a = 3; var b = ++a; console.log(a); //4 console.log(b); //4
综合表达式
综合运算的运算顺序
运算顺序: 非运算 -> 数学运算 -> 关系运算 -> 逻辑运算
5 < 3 + 3; //true 3 > 2 && 8 > 4 +3; //true 3 > 2 && 8 > 4 + 4; //false !13 < 5-3; //true !13 < 5 -5; //false