浏览器内核
IE trident
Chorm blink
firefox Gecko
Opera webkit
Safari webkit
解释型语言:解释一行执行一行,将代码转换成机械码。执行速度相对较慢,可以跨平台。
编译型语言:先将代码翻译成系统可以识别文件,再将文件转换成机械码,执行速度相对快, 不能跨平台。
js是解释型语言并且是单线程的。
script 标签不能同时外部引用和内部引用,(内部引用不会生效)
变量
变量 b变量的名字必须以字母、_、$开头 变量名可以包含数字 不可以用系统的关键字保留字做为变量名
var a = 0,
b= 1,
c= 3;
数据类型:
1、原始值 Number,Boolean,String, undefinde, null steck(栈):first in last out
undefinde:变量声明了没有赋值。
null:占位
2、引用值
array, Object, function , 。。。 data , RegExp heap(堆)
唯一区别: 复制形式不同
3.typeof 返回的六个值为:number、string、boolean、undefined、object、function。
书写规范
for ,function , if 后面不用加很分号
错误类型
错误分两种:
1、低级错误:(语法解析错误) SyntaxError 语法解析错误
2、逻辑错误:(标准错误) ReferenceError 引用错误。
js语法错误会引发后续代码终止,但不会影响其他js代码块。
js运算符
+
数学运算、字符串拼接
任何数据类型加字符串都等于字符串。
0/0 //NaN 1/0 //infinity
// ++ -- += -= /=
var a = 10;
document.write(a++); // 10 document.write(a); 11
document.write(++a); // 11
先计算,后赋值
赋值的顺序,自右向左。 计算的顺序,自左向右
var a = b = 10;
var a = 10;
var b = ++a - 1 + a++; ++a时,a的值为11 , -1 为 10 , 加 a 此时a的值为11,所以结果为10 + 11 得 21.
document.write(b + " " + a); // a = 12 b = 21;
a += 1 相当于 a = a +1;
a %= 1 相当于 a = a%1;
1.比较运算符
var a = 2 > 1; // true
>,<,>= ,<=,==,!=都是比较运算符,他们的返回结果是true或false。
当两个字符串相比较时,比较的时对应的ascII码的值。
var a = '10' > '8' // false
undefined == undefined // true
Infinity == Infinity // true
NaN == NaN // false
比较的是字符串‘1’,‘0’与‘8’的asccII码。1的ascII小于8的ascII,0的ascII小于8的ascII,所以‘10‘ < ’8‘.
如果一个不是字符串,并且两个都是原始类型,将他们都转换为数字进行比较。
NaN与任何数字比较得到的结果都是false。
Infinity 比任何数字都大。
-infinity 比任何数字都小。
NaN < Infinty // false
如果其中一个是对象,将对象转换为原始类型。
相等比较
== 、 !=
一、两端的数据类型相同,直接比较两个数据本身是否相同(两个对象比较地址)。
二、两端的类型不同
1). null 和 undefined, 他们之间相等,和其他原始类型比较则不相等。
null == undefined // true
null == 0 // false
undefined == 0 //false
2). 其他原始类型,比较时先转换为数字,再进行比较。
3). NaN与任何数字比较都是false,包括自身。
4).Infinity和-Infinity,只能自身和自身相等。
5). 对象比较时,要先转换成原始类型再进行比较
=== !==
1.两端类型相同,规则和相等比较一致。
2.两端类型不同为false。
null === undefined //false
null == undefined // true
2. 逻辑运算符 && || !
只有 undefined, null, NaN, “”, 0, false 转换成boolean值以后为false,其他值都会转为真。
var a = 1 && 2; // 2
var num = 1 || 3;
var n = !123;
与运算符会先看与运算符前面的表达式转换成boolean是否为真,如果为真,那么它会看第二个表达式转换为布尔值的结果。如果只有两个表达式,会直接返回第二个表达式的值。
当第一个表达式的值为false时,直接返回第一个表达式的值。
或运算符当第一个表达式结果为真时,返回第一个表达式。如果第一个表达是为假直接返回第二个表达式的值。
非运算符会将表达式转换成布尔值后取反。
算数运算符
其他数据类型使用算数运算
1.除加号之外的算数运算符。
将原始值转换为数类型(自动完成转换),然后进行运算。
bollean:true =》 1, false =》 0.
string:如果字符串内部是一个正确的数字,直接变为数字,如果是一个非数字,则得到NaN(能识别Infinity,不能把字符串内部的东西当作表达式)。
null:+ null =》 +0 ; - null =》 - 0。
undefined:undefined =》 NaN;
2.加号运算符
-加号运算符一边有字符串,含义变为字符串拼接。
将另一边的其他类型,转换为字符串。
数字 -》 数字字符串。
boolean =》 boolean字符串
null =》 “null”
undefined =》 ”undefined“。
+”“ =》0.
字符串转换时会忽略前后空格。
for循环
for(var i = 0;i < 10; i++) {
document.write('a');
}
/*
1.先执行var i = 0;
2.if(i < 10) {
document.write('a');
}
3.i++
4.然后重复执行步骤2和步骤3.
*/
var i = 0;
for(; i < 10; ) {
document.write('a');
i++;
}
/*
与第一种for循环的写法意思相同,for循环的执行顺序没变。
*/
if 判断
包装类
var num = 4;
num.len = 3;
console.log(num.len); // undefined
/* num 作为原始值是不会有属性和方法的。系统会隐式的将num转化为new Number(4).len = 3,然后执行delete方法将该属性删除。当再次访问num.len时,又重新将num.len 转换为new Number(4).len,此时得到的值为undefined。
*/
var arr = [1,2,3];
arr.length = 2;
console.log(arr); // [1,2]
/* 当修改数组的length 属性时,会将数组截断。此时将arr的 length属性变为2,则arr为[1,2]。
*/
var str = 'abc';
str.length = 2;
//new String('abc).length = 2 delete
//new String('abc').length 原本new String()上就有length属性,返回的就是字符串的长度
console.log(str.length) //3
Math四舍五入的方法:
方法 | 注释 |
---|---|
Math.floor | 将数值进行向下取整 例如:Math.floor(123.456) //123 |
Math.ceil | 将数值进行向上取整 例如:Math.floor(123.456) //124 |
Math.round | 将数值四舍五入成整数 例如:Math.round(123.666) //124 |
parseInt | 将数值舍弃小数部分转换成整数 例如:parseInt (123.666) //123 |
toFixed() | 将数值四舍五入成整数 例如:143.666.toFixed(2) // '143.67 ’ 注意toFixed的返回值为string类型 |
因此我们需要写一个能返回数字类型的值还并且能够四舍五入的方法:
function round (num,d){
num *= Math.pow(10,d);
num = Math.round(num);
return num/Math.pow(10,d);
}
console.log(round(123.456,2)) //传2为保留两位小数四舍五入
console.log(round(234.567,0)) //传0 为数字本身四舍五入
console.log(round(161,-1)) //传-1为整数部分四舍五入
console.log(round(168,-1))
输出结果如下:
思路:首先要进行四舍五入就会用到Math.round() 的方法。观察Math.round 的行为:Math.round的返回值为整数,并不能对小数进行保留。
因此我们可以通过扩大倍数(小学数学思想)来进行四舍五入,小数每扩大10倍小数点就会向后移动一位。比如求161.25四舍五入并保留一位有效数字:
var a = 161.25*10; //a 1612.5
a = Math.round(a); //a 1613
a/10 = 161.3 //因为前面将数字扩大了10倍,为保持数值不变最后的结果应除以原来扩大的倍数。
对于Date对象的小技巧
new Date().getMounth()的返回值为 0 -11;
如果 new Date(year,mouth,0).getDate();此时的返回结果为当前月最后一天。
如果当传入的日期为0时,则查询的getDate的值会返回上个月最后一天的值。
适用场景:日历。
看下面代码:
console.log(1 + undefined) //NaN
console.log(1 + null); //1
console.log(null + undefined); //NaN
console.log(true + false); //1
console.log(3 +'6'); //'36'
console.log(2 +[]); //'2'
console.log(2 +{a:2}); //'2[object Object]'
console.log([] + {}); //'[object Object]'
console.log({} + []); //['object Object]'
console.log(3 + {}); //'3[object Object]'
console.log({} + 3); // '[object Object]3'
console.log(1 * []); //0
console.log(1 * [2]); //2
console.log(1 * [2,3]); //NaN
console.log(1 * {}); //NaN
当进行加法运算时会进行隐式类型转换,如果加号两边的值不是引用类型且不为字符串类型,加号两边的值会先进行数值类型的转换。
Number(undefined) 的 值为 NaN,因此 1 + undefined 的值为NaN,Number(null) 的值为0。true 和 false 分别转换成0和1。当+号遇见字符串时会按照字符串拼接的规则执行。当+号遇见数组时,会将数组的两个中括号去掉,里面的值加上“”,因此2 + [] 的值为’2’。当*遇见[]时,会将[]的值转换为“”,“”转换为0。当+号遇见对象时会调用Object的toString方法将对象转换为字符串,对象转换的结果为’[object Object]’,所以3 + {}的值为 ‘3[object Object]’。