1.什么是字面量,标识符,保留字?
字面量即程序中的数据的值;标识符指数据的名字(字母、下划线_或美元符号$开头,为了和数值区分开,标识符不能用数字开头,);保留字是JS保留的某些可以使用的标识符,用来给自身使用,如null,if等。
2.什么是Unicode?(补充:什么是ASCII码 ?是一套电脑编码系统,可以用来表示大小写英文字母、数字和一些符号,到目前为止共定义了128个字符。)
Unicode是一个编码规范,目前实际实现的unicode编码只要有三种:UTF-8,UCS-2和UTF-16。
JS使用Unicode字符集编写,注:不支持表情符号
Unicode的转义序列是使用ASCII字符来代表任意16位 Unicode 内码,这些 Unicode 转义序列均以 \u 为前缀,其后跟随4个十六进制数(例如 \u4e00),以便于某些支持使用老技术的系统可以处理Unicode字符集。
https://blog.csdn.net/u012672456/article/details/44750277
1.JS中,只有null和undefined是不能调用方法的值,这两个值是特殊值。
2.常用的Math、Number对象属性:
Math.pow() .floor() .ceil() .abs() .max() .min() .random()
Number.MAX_VALUE .MIN_VALUE .parseInt() .parseFloat() .isNaN() .isFinite()
注:NaN=>"非数值",不等于任何值甚至自己,所以x===NaN不能得出x是否为not a number,需用Number.isNaN(x)或x !== x
toString()方法和parseInt()方法对比:
number.toString(进制)方法是把一个 Number 对象转换为一个字符串,并返回结果。
parseInt(num,基数)函数将字符串转为数值并返回一个十进制整数或NaN。
两者参数不一样,toString方法填写要转换的进制,
而parseInt函数的第二个参数是填基数(即我原本是几进制的数,不填的话则默认原本数值的以开头为 "0x" , 0, 1 ~ 9 分别为十六进制的整数,八进制或十六进制的数字,十进制的整数),它返回的数值为十进制的整数或NaN!!!
3.所有二进制编程语言都无法精确表示哪怕0.1的数,所以二进制浮点数之间不能比较其相等性(相加减之后比较,数值的精确度不一样)
4.字符串
字符串使用for/of循环或...操作符的迭代,迭代的是字符!
字符串不可修改,toUpperCase()等方法均返回新字符串!
字符串可被当作只读数组,用方括号而非charAt()方法可访问个别字符:
let s = "hello"
s[0] //"h"
位于${ 和对应的}之间的内容会被当作JS表达式来解释:
let name = "BILL";
let ee = "Hello ${name}" ;// ee==Hello BILL
5.布尔值
布尔值只有一个有用的方法:toString(),用于将自己转换为字符串true或false。[拓:除null和undefined外,所有值都有toString()方法]
假性值六个(转布尔值时均为false):undefined,null,0,-0,NaN,""(空字符串)!!!其他均为真性值。JS的所有值均可转为boolean。例子:
假设变量o要么保存一个对象,要么是null:
1)if(o !=== null)... 只要不是null就执行。当需要严格区分null、0、" "时使用
2)if(o)... 只要不是false或其他任何假性值就执行。
6.null和undefined区别?
null(关键字):值不存在,typeof null ;返回字符串 "object" ,所以它是一种特殊对象,表示”没有对象“。
undefined(全局常量):更深层次的值不存在,变量的值未初始化时为undefined,查询不存在的对象属性或数组得undefined。
注:相等操作符==认为他们相等。
两者没有属性或方法,so用.或[ ]访问这两个值的属性或方法均导致TypeError。(对应章3.1)
7.对象(引用类型)
按引用进行比较,
对象值就是引用,
分为赋值引用(浅拷贝)和创建对象新副本(深拷贝,需要显示复制对象的属性或数组的元素)
8.类型转换
JS将+看作算术运算符而不是一元运算符,so有字符串时,JS采用字符串加法运算符(+操作符计算中有一个操作数是字符串时,则另一个操作数也会被转为字符串,即优先字符串拼接):
1 + 1 + 1 + 1 + "" ;//"4" 10 + " objects" ;// "10 objects",将10转为字符串后计算
但是JS其他时候更期待数值,所以除上面特殊的情况,其他都选择将字符串转换为数值、将==操作符中的操作数转为数值:
1 + 1 + 1 + 2 * "" ;// 3,将""转为数字0后计算
1 == "1" ; //true,字符串转为数值
1 == "a" ; //false,字符串“a”转数值为NaN
"0" == false ; //true,两者均转为0
"true" == true ; //false,"true"转为NaN,true转为1
null == undefined ;//true ,这里特殊,不要试图通过转换为数据类型来解释这个结论,因为Number(null);为0,Number(undefined);为NaN。而ECMAScript 规范认为,既然 null 和 undefined 的行为很相似,并且都表示 一个无效的值,那么它们所表示的内容也具有相似性
{ }(任何对象)转布尔值为true,[ ](空数组)转布尔值为true(对应章3.5)!!
9.所有对象都继承两个在对象到原始值转换时使用的方法:toString()和valueOf()。对象到数值的转换先使用偏数值算法将对象转为一个原始值,得到的原始值转为数值,偏数值算法先尝试valueOf(),将toString()作为备用。String\Number\Boolean 这样的包装类定义的valueOf()方法也只是简单地返回被包装的原始值,Array、Function和RegExp简单地继承默认方法。Array类继承默认的valueOf()方法,该方法不返回原始值,so数组转数值时,最终会调用toString()方法。如:
Number([ ]) ; //0 ,空数组先转为空字符串,空字符串转为数值0
Number([99]) ; //99,先转为字符串“99”,再转为数值99
注:多数对象没有valueOf()方法,因此会用toString()方法转换,如 Date对象p71
1 + { } // "1[object object] ",对象转换为字符串(使用toString()方法)后再拼接
2 + null //2 ,null转换为0(使用valueOf()方法)后计算加法
2 + undefined //NaN,undefined转为NaN后计算加法
p51 let const var
10.什么是解构赋值?p55
右侧值中提取(解构)出一个或多个值,保存到左侧变量中:
let [x,y] = [1,2];//相当于let x=1,y=2
1.属性访问表达式中有两种访问属性的语法:
1)表达式(指定对象)后跟一个句点和一个标识符(指定属性名)
2)表达式后跟另一个位于方括号中的表达式(指定属性名或数组元素的索引)注:位于.或[前面的表达式都会先求值。若求值结果为null或undefined,抛出TypeError,cause他们是JS中不能有属性值的两个值。但若是指定名字的属性不存在,则属性访问表达式的值是undefined。
避免报错方法:用?.或?.[ ]语法防止报错。
同样,函数和方法调用也可用?.() 而不是()来防止报错:
o.m() ; //常规调用
o ?. m() ; //条件式属性访问,常规调用
o.m?.() ; //此处o必须不是null或undefined才不会报错
2.幂、一元、赋值、三元条件操作符具有右结合性:
w=(x=(y=z)); 等价于 w=x=y=z;
3. in操作符,instanceof操作符,typeof操作符 ,delete操作符p78
4.逻辑与(&&):只有左操作数为真值时才会对右侧求值
if(a === b) stop(); //只有a===b时才调用stop(ÿ