JS介绍

前端工程师打交道最多的就是“浏览器”了。国产的浏览器因为没有自己的内核,再知名都算不上主流浏览器,感觉也是挺... 。

主流浏览器(内核)

IE(trident)

Chrome (webkit/blink)

Firefox(Gecko)

Opear(Presto)

Safari(webkit)

PS:面试时候可能会被问到浏览器内核,面试官是想知道你对自己的发展路径是否清晰,这类不难又比较边角的知识可以反映出这个问题。

JS的特点

解释性语言单线程

JS三大部分

ECMAScript , DOM , BOM 

JS如何引入

为符合WEB标准,结构(HTML)、样式(CSS)、行为(JS)相分离,通常会采用引部引入。

两种方式

<script type="type/javascipt">//代码</script>  //1. 页面级JS
<script>//代码</script> // 不带type

<scrip src="./pub.js"></script> //2. 引入外部文件

又引入外部文件,又在script里写代码行不行?  不行。

<scrip src="./pub.js">
document.write('hello world!'); // 不执行
</script>

JS基本语法

变量(variable)

var a;    // 声明
a = 100; // 赋值

var a = 10,
b = 20,
c = 30,
d = 40,
e;

命名规则

1. 变量名必须以英文字母、_、$开头;

2. 变量名可以包括英文字母、_、$、数字;

3. 不可以用系统的关键字、保留字作为变量名;

值类型--数据类型

原始值(stack): Number,Boolean,String,Undefined,Null

引用值(heap):Array,Object,Function,...date,RegExp

基本语法

语句后面要用分别结束“;”

JS语法错误会引发后续代码终止,但不会影响其它JS代码块

书写格式要规范,"=+/-"两边都应该有空格

JS运算符

操作运算符

"+" 数学运算、字符串链接(任何数据类型加字符串都等于字符串);

"-","*","/","%","=","()";

优先级"="最弱,"()"优先级最高;

"++","--","+=","-=","/=","*=","%=";

赋值的顺序:自右向左;计算的顺序,自左向右;

var a = 1 + 2;  // 3
var a = "a" + "b"; // ab
var a = "a" + 1 + 1; // a11
var a = 1 + 1 + "a" + (1 + 2) // 2a3
var a = "a" + true; // "atrue"

var a = 0 / 1; // 0
var a = 0 / 0; // NaN "Not a Number",非数,也是Number类型
var a = 1 / 0; // Infinity 无穷,也是Number类型
var a = -1 / 0; // -Infinity 负无穷

var a = 5 % 2; // 1 商2余1
var a = 3 % 4; // 3 商0余3

var a = 10;
a ++ // 11 相当于 a = a + 1

var a = 10;
document.write(a++); // 10 先执行打印,后执行++

var a = 10;
document.write(++a); // 11 先执行++,后执行打印

var a = 10;
var b = ++a -1 + a++;
document.write(b + " " + a); // 21 12

var a = 1;
var b = a-- + --a; // b = 1 + (-1) = 0
document.write(b); // 0

var a = 1;
var b = --a + --a; // 0 + (-1)
console.log(b); // -1

var a = 10;
a += 10; // 20 a+=10 等价于 a=a+10

var a = 10;
a += 10 +1; // 21

var a = 10;
a %= 2; // 0

var a =(10 * 3 - 4 / 2 + 1) % 2; // a=1
b = 3;
b %= a + 3; // b = 3;
document.write(a++); // 1 先输出1 ,再++;
document.write(--b); // 2 先--,再输出;

// var a = 123; var b = 234; 交换ab的值;
var a = 123;
var b = 234;
var c = a;
a = b;
b = c;
document.write(a + "-" + b);

// 或,另种写法
var a = 123;
var b = 234;
a = a + b;
b = a - b;
a = a - b;
document.write(a + "-" + b);

比较运算符

">","<","==",">=","<=","!="

比较结果为boolean值

var a = 1 > 2;
document.write(a); // false

var a = "a" > "b"; // false 字符比较的话,比较的是ASCII码顺序
var a = "1" > "8"; // false
var a = "10" > "8"; // false 先拿第一位比,相同的话,再顺序向后比
var a = 1 == 2; // false
var a = 1 != 2; // true
var a = undefined == undefined // true
var a = Infinity == Infinity // true Infinity是固定值,注意首字母要大写
var a = NaN == NaN // false NaN不等于任何数,包括自己

逻辑运算符

&&   逻辑与。 全真才是真,有一个假即为假,遇到假就返回;

一定会返回结果,一般用在IF判断中:将结果转换成布尔值;

【如果只有两个表达式】,先看"前一个表达式"转换成boolean值是否为真:如果为真,直接返回第二个表达式的值。如果为假,直接返回第一个表达式,不会再看第二个表达式。

var a = 1 && 2;
document.write(a); // 2 前一个表达式为真时,直接返回第二个表达式

var a = 1 && 0;
document.write(a); // 0 前一个表达式为真时,不论第二个表达式是真是假,都直接返回;

var a = 0 && 1;
document.write(a); // 0 前一个表达式为假时,直接返回第一个表达式,不会再看后面的。

【如果是三个表达式或更多】,先看第一个,是真的就看第二个,是真的就往后走,如果第三个是最后一个,就把第三个返回。如果到第二个是假的,就把第二个返回,后面不管;如果第一个就是假的,就把第一个返回,后面不管;所以连成串的,遇到假的就叫停,直接返回。

var a = 1 && 2 && 3;  // 3 前两个真,直接返回第3个
var a = 1 && 2 && 0; // 0 前两个真,不论真假,直接返回
var a = 1 && false && 3; // false 遇到假直接返回;
var a = 0 && false && 3; // 0 第一个是假,遇到假就直接返回了

从这个特点看,“&&” 与运算有个中断作用,可以把"&&"运算当作判断来执行,俗称短路语句。

2>1 && document.write('hello world!'); // hello world  右侧表达式执行了

有时后端给的数据不一定有意义,所以前端需要给他的数据来个判断。

var data = ... ; 
data && fn(data); // data 有值才执行

|| 逻辑或。 全假才是假,有一个真即为真,遇到真就返回;

var num = 1 || 0 || 0;  // 1
var num = 0 || false || 2; // 2

可以用来写兼容,如:IE浏览器中e没值,需要用window.event,非IE浏览器中e有值。

div.onclick = function(e){ 
var event = e || window.event; // 可以用 || 来写兼容,哪个有值就把哪个赋值给 event
}

! 逻辑非。先转换成布尔值,再取反。

var a = !123; // false
var a = !""; // true
var a = !!NaN; // false
var a = !!0; // false
var a = !!undifined; // false

var a = true;
a = !a; // false 自身取反

被认定为false的值

一定会返回false的特殊类型有这六个: "undefined","null","NaN","""","0","false"。