·前言·
喜欢记笔记,不喜欢看书,本着把书先“看薄”才能“变厚”的原则,菜鸟的我随手总结下js常见基础知识点,写的简略,主要是为自己积累预备着。大家也就看着当个乐呵,如果有评论和不完善之处,欢迎随便提出。
- 六种基础类型:undefined, boolean, string, number, object, function。值得注意function和undefined。
- undefined的默认赋值与使用,与null的继承关系: undefined继承自null
null == undefined; //true
- 任何时候不要为变量显式声明undefined,毫无必要,任何声明值var默认值都是undefined
var a;
// var b;
alert(typeof a); //"undefined"
alert(typeof b); //"undefined"
alert(a); //"undefined"
alert(b); //出错
- null的js含义是"空对象指针",是允许且建议赋值为null的。这点和java类似,也允许把无用的object赋值为null触发垃圾回收。
alert(typeof null); //"object"
alert(null instanceof Object); //false
- if(xxx)隐含是对任意类型的Boolean类型转换。
//For object
var obj_undf ;
var obj_null = null;
var obj_epty = {};
var obj_newO = new Object();
if(obj_undf) // false=> undefined永远转化false(实际上是一种特殊的null)
if(obj_null) // false=> null对象永远转化为false
if(obj_epty) // true
if(obj_newO) // true
//For string
var str_undf ;
var str_null = null;
var str_epty = '';
var str_notE = 'null';
if(str_undf) // false
if(str_null) // false
if(str_epty) // false=> 空字符串false
if(str_notE) // true => 仅仅长度>1字符串转化为true
//For Number
var num1 = 0; //false
var num2 = NaN; //false
var num3 = Infinity; //true
//仅仅 NaN(Not a Number) 和 0 转化为false
- 数值转换三种基准方法Number(), parseInt(), parseFloat().
Number(object)的运行顺序是先去valueof,若返回NaN则先toString在算string的value
parseInt(value, base),是允许后一个参数指定基数的,默认为十进制。显示声明base参数是个好习惯!
parseFloat没基数可选,默认永远是十进制。
parseInt('14', 16); //20
/*
解释一下这句话:用16进制去解析‘14’字符串代表的数,转化成10进制Number
*/
- Float 无论何时别用==/===操作符比较!对啥语言都适用!
- NaN=Not a Number, 对NaN任意操作都返回NaN(这个好理解吧,NaN转换出来数值才是见鬼了),NaN和任意值甚至自己都不等! NaN的存在意义只是为了转化不良数据时不会产生错误。这点不像其他编程语言那样转换不了程序直接抛异常死给你看。
parseInt('yahaha', 10) // NaN
- 常见的两种转换成string的方法:object.toString()和String(object),null和undefined是没有toString的(报错),而String()方法可返回"null",“undefined”。
- 乘法运算个例是Infinity,
Inf*0 == NaN;
Inf*Inf == Inf;
Inf*not0 == +Inf/-Inf
除法运算更是奇葩:
Inf/Inf == NaN;
0/0 = NaN;
Not0/0=+/-Inf;
Inf/Not0 = +/-Inf;
取模运算有三个特例但是很好记:
Inf/Inf == NaN;
0%0 == NaN;
Inf%0 == NaN
加法唯二特例:
(+Inf)+(-Inf) == NaN;
(+0)+(-0) == +0
减法对0有三个特例,对Inf有两个特例:
(+0)-(+0) == +0;
(+0)-(-0) == -0;
(-0)-(-0) == +0;
Inf-Inf == NaN;
(-Inf)-(-Inf) == NaN;
- if的时候用全等号===比较是个好习惯
- 关于循环,两个死循环要牢记,while(true)和for(;;)这对“死”基友;外加要
习惯for(var i in array)循环 - label:xxx的用法个人认为不是个好习惯,有点goto语句的意思,但是却可以明确定位continue和break点。起码高级语言很少有这特性。
- JS有with(xxx){do xxx}的用法,但是严格模式下不建议使用。with的含义是将括号内xxx引入如下作用域。js中没有“块级作用域”这个概念,换句话说,{}括起来的,以往高级语言里在{}外并访问不到的东西,在js中对{}之后之外的代码可见。
var str;
if(str){
var flag = 'yes';
}
else{
var flag = 'no';
}
console.log(flag); //不报错且真的能返回no
- JS的swtich语句最大特色在于支持传bool比较式:
case num>0&&num%2==0
- 函数的arguments数组中每一个值和函数的字面引用一一对应。arguments中值的修改会自动反映到对应的命名参数。然而严格模式下,重写arguments是不允许的!
- js是没有传统意义上的重载的,因为传入的参数数量本身就允许不固定,返回值也不加显式限制,在同一函数中完成多个参数条件下的处理即可。
- 值传递和引用传递,函数内修改一个传入对象的字段是否会对原始字段有影响?(会)函数内重新定义一个传入字段,改变其引用指针至一个新建对象,是否会对原始字段有影响?(不会,因为改变原有引用作用域只是函数内)
- typeof返回对象类型,instanceof [Object]检测是否是某种对象返回boolean值。
- js垃圾回收的两种机制:markup标记引用法,refcount引用计数法。几乎所有常见浏览器都用标记法,以“作用域”为单位;refcount跟踪计算变量的引用次数,可能会引起相互循环引用(你中有我我中有你,互相引用计数老死无法归零)
- Object对象的属性可以可以声明为var Person = {name:“xxx”}等同于var Person = {“name”:“xxx”};属性可以自由选择加不加双引号。
- 属性支持用引号+propName的形式类似Dictionary的形式去访问:Person.name == Person[“name”];后者最大的好处就是支持传入参数“属性名”(Person[someName]),和一些本来语法错误的属性名(Person[“first name”]).
鉴于Dic这种访问属性方法神奇的灵活,建议用点号访问。除非非要用变量属性名。 - 创建一个空对象:var something = {}; 创建一个空数组:var arr = [];
- 数组越界访问一个下标并不存在的对象,并不会像传统编程语言一样报下标越界的异常,只会返回一个undefined。
- 用arr instanceof Array和Array.isArray()方法检测对象是否是数组。
- s数组是一种很牛逼的数据结构,其中还集成了栈stack和队列queue的实现方法:
stack:push()返回值是栈的大小;pop()返回值是弹出对象
queue:push(), shift()出队头部元素.
值得注意的一个奇葩实现:unshift()在头部插入元素,和尾部出栈方法pop()结合,反向实现队列。 - 数组集成一个sort方法,以字符串方式比较数组元素后排序,sort方法支持传入一个排序compare方法(return-1,0,1)重定义排序大小 。还集成了一个reverse方法,返回的是sort的反序。
- 数组的几个应知应会方法:
//concat拼接方法:
colors.concat(colors2);
//slice截取方法:
colors.slice(1,3); //返回1<=i<3标号组成的新数组
//splice神奇的万能方法:它的返回值是被删除的项
splice(deletefromIndex, deleteCount, arsToBeInserted...);
splice(1,3)//从编号1开始,删除三项,不插入
splice(2,0,"red","yellow");//在第二项之前(编号1之后2之前),不删除,加两项
splice(1,1,"red");//替换编号1这项
- 数组的5大迭代方法:二匹配every(),some();二批量map(),forEach();一查询filter()
every和some俩方法功能符合字面意思,‘全符合’则every返回true,‘只要有一个符合’则some返回true。
map,对每个元素施加方法,返回结果集。值得注意传入方法的参数顺序
var colors = ["green", "blue", "grey"];
//返回的是每一个item加入‘color: ’处理的结果
console.log(colors.map(
(item, index, array) => {
return "color:" + item
}
));
forEach,对每个元素施加方法,不返回结果。
colors.forEach(item => {another.push(item)});
filter,针对item/index做过滤处理.返回滤后结果。
colors.filter((item, index, array) =>
{ return index>=1; });
- 数组归并方法:从左(reduce)/右(reduceRight)开始,逐项处理,
prev保存上一步的处理结果,cur为当前值,返回归并结果
colors.reduce((prev, cur, index, array) =>
{ return prev + "," + cur; })) //返回green,blue,grey