Js关键字的使用
var或let 声明变量
(var会变量提升,支持重复声明,没有块级作用域, 兼容IE7;
let不会变量提升,不支持重复声明,有块级作用域,兼容IE11;)
Const 声明常量;声明的常量必须进行初始化
alert(test) 弹出警示框
数据类型:
数字(Number)
字符串 (String)
布尔值 (Boolean)
空 (Null)
未定义 (Undefined )
Typeof 操作符检测数据类型
"undefined"——值未定义;
"boolean"——布尔值;
"string"——字符串;
"number"——数字;
"object"——对象或者null;
"function"——函数
调用typeof null会返回"object",因为特殊值null被认为是一个空的对象引用。
Undefined类型只有一个值,即undefined
声明了一个变量但没有给它赋值,这个变量的默认值就是 undefined
Null类型只有一个值即null。
当我们想让变量具有有效值,却又不是任何具体值时,就把null赋给变量。
boolean类型只有两个值: true和false,注意必须小写
这两个值与数字值不是一回事,因此 true不一定等于 1,而 false也不一定等于 0
NaN表示非数值,not a number 不是个数字
isNaN()函数能够检测其参数是否为一个“数字”,是数字返回false(不喜欢数字),非数字返回为true
Number()方法:可以用于任何数据,如果包含非法字符,则返回NaN
parseFloat()函数解析字符串并返回一个浮点数。
parseInt()方法把数据转为数字类型
String() 任何的数据类型都能转(全局函数,属于window对象的方法,相当于window.String() )
toString() 不能转null和undefined类型,其他类型都能转(属于字符串的方法,必须str.toString() )
算术运算符
+ 用来做加法运算
- 用来做减法运算,数字和字符串相减,会把字符串自动变成数字进行运算
* 用来数学乘法运算,数字和字符串相乘,会把字符串自动变成数字进行运算
/ 用来数学除法运算,数字和字符串相除,会把字符串自动变成数字进行运算,如果除数为0,结果为Infinity 无穷大;Infinity 为数字类型
% 模运算符 %,就是求余数,不够除为它自己,0%3=0 ,1%3=1 ,2%3=2,3%3=0
++ 递增运算符(++) 为其操作数增加1,返回一个数值。
-- 递减运算符(--) 为其操作数减1,返回一个数值。
赋值运算符
=、+=、-=、*=、/=、%=
比较运算符
<、>、<=、>=、(等于:==、不等于!=)、(全等于===、全不等于!==)
逻辑运算符
&& 且运算,一假且必假:两个有一个假的,值就是假的那个;两个都真,值为后;
|| 或运算,一真或必真:两个有一个是真的,值就是真的那个;两个都真,值为前;
! 非/取反,把右边的数据类型转成布尔值
所有逻辑运算符的优先级都低于比较运算符
三目运算符
条件 ? 语句1 : 语句2
和if判断的第2种写法作用是一样的。优先级高于赋值,低于其他运算符
If语句:if语句括号里面的表达式,会自动调用Boolean()转型函数将这个表达式转换成一个布尔值
Switch语句:switch 语句评估一个表达式,将表达式的值与case子句匹配,并执行与该情况相关联的语句。和多分支if...else if...else语句 作用是一样的
Expression:一个用来与 case 子语句匹配的表达式。
case valueN 可选 :用于匹配 expression 的 case 子句。如果 expression 与给定的 valueN 相匹配,则执行该 case 子句中的语句直到该 switch 语句结束或遇到一个 break 。
default 可选:一个 default 子句;如果给定,这条子句会在 expression 的值与任一 case 语句均不匹配时执行。
default在switch语句中的最末尾可以不加break,但是在中间或头部要加break
循环
For循环:重复执行某些代码,每次执行的时候,有个数字在变化
For...in循环:
已知数组:var arr=['15','11','999']
x指代数组里面的下标0 , 1, 2...
for( x in arr ){
alert('第'+x+'个东西是:'+arr[x]);
}
While循环:while 循环会一直循环代码块,只要指定的条件为 true(先判断再执行)
Do...while循环:在检查条件是否为真之前,会先执行一次do里面的代码,然后只要条件为真就会重复循环。(先执行再判断)
双重循环:一个循环体内又包含另一个完整的循环结构
双重循环注意:
各循环可互相嵌套
一般不超过三层
外层循环变量变化一次,内层循环变量要变化一遍
Break:跳出当前循环结构或switch分支结构
Continue: 跳过本次循环,执行下一次循环。(就是不要再走continue后面的语句了)
注意:只能在循环结构内使用(while,do/while,for,for/in)
arr.length:数组的长度
数组的方法
unshift() 和shift():数组开头添加和删除
push() 和 pop():数组末尾添加和删除
slice(start,end) :截取数组中的元素;不操作数组本身,(字符串也有这个方法,用法一样,但是数组没有substring方法)
splice(索引,删除的数量,添加的元素):操作数组本身,兼具删除,添加和替换功能
indexOf():返回某个指定的元素在数组中首次出现的位置
lastIndexOf():返回某个指定的元素在数组中最后出现的位置
Concat():用于合并两个或多个数组。此方法不会更改现有数组,而是返回一个新数组。
Join():把数组元素按指定分隔符组合成一个字符串;如果没有分隔符,默认是逗号。不操作数组本身
Reverse():将数组中元素的位置颠倒,并返回该数组。数组的第一个元素会变成最后一个,数组的最后一个元素变成第一个。该方法会改变原数组
includes(): 方法用来判断一个数组是否包含一个指定的值,如果包含则返回 true,否则返回false。
Sort():按照字符的unicode编码排序,默认升序,先排第一个字符,以此类推
迭代方法
Foreach():循环数组或集合中的对象、数据
Map():返回一个由原数组每个元素执行回调函数的结果组成的新数组。
Filter():返回让回调函数为true的元素组成的数组
Every():有一个元素让条件为false,则返回false 。且剩余的元素不会再进行检测。
Some():有一个元素让条件为true,则返回true 。 且剩余的元素不会再进行检测。
Reduce():循环数组中的每一项进行累计操作
Find():返回满足条件的第一个元素的值。否则返回 undefined。
findIndex():返回数组中满足条件的第一个元素的索引。否则返回 -1。
日期对象
new Date():创建一个日期对象
new Date(milliseconds) :一个 Unix 时间戳(Unix Time Stamp),它是一个整数值,表示自1970年1月1日00:00:00 UTC(the Unix epoch)以来的毫秒数,忽略了闰秒。请注意大多数 Unix 时间戳功能仅精确到最接近的秒。
new Date(dateString) :时间戳字符串
字符串对象
Length:获取字符串的长度
Str.charAt(下标):返回指定下标所在的字符,第一个字符的下标为0。
Str.charCodeAt(下标):根据下标获取字符的 Unicode 编码,下标从0开始
Slice()和substring():截取一个字符串的一部分,并返回一新的字符串
Search(‘string’):找到了返回其下标,找不到返回-1 (类似indexOf()方法)
Match(‘string’):只能匹配一个。返回数组或null
Replace(‘string1’,’string2’):把string1替换成string2
Split(‘string’,[limit]):使用指定的分隔符字符串将一个字符串分割成字符串数组;limit一个整数,限定返回的分割片段数量,可以使用正则表达式:str.split(regExp)
toUpperCase():转换为大写str.toUpperCase()
toLowerCase():转换为小写str.toLowerCase()
Trim():删除字符串两端的空白字符。在这个上下文中的空白字符是所有的空白字符 (space, tab, no-break space 等) 以及所有行终止符字符(如 LF,CR等)。
includes(): 用于判断一个字符串是否包含另一个字符串,如果当前字符串包含被搜寻的字符串,就返回 true;否则返回 false。区分大小写
indexOf(‘string’,下标):返回某个指定的字符串值在字符串中首次出现的位置
lastIndexOf('string',Number):返回某个指定的字符串值在字符串中最后出现的位置
startWith(‘string’):字符串string是否在原字符串的开头,返回布尔值
endsWith(‘string’):字符串string是否在原字符串的结尾,返回布尔值
Concat():str.concat(str1,str2,...) ,将多个字符串连接成一个字符串,用+更简单一些,推荐
Repeat(n):将原字符串重复n次后返回一个新字符串
Math对象
Math.ceil(x) 参数x是一个数字,向上取整,返回 大于或等于 给定数字的最小整数
Math.floor(x) 参数x是一个数字;向下取整,返回 小于或等于 给定数字的最大整数
Math.round(x) 参数x是一个数字;返回一个数字四舍五入后最接近的整数
Math.random() 函数返回一个大于等于0,小于1之间的随机数
Math.max(value1[,value2, ...]) 参数value1, value2, ... 是一组数值。返回给定的一组数字中的最大值,
Math.min(value1[,value2, ...]) 参数value1, value2, ... 是一组数值;返回给定的一组数字中的最小值,
Math.PI 圆周率,一个圆的周长和直径之比,约等于 3.14159
Math.SQRT1_2:1/2的平方根, 约等于 0.707
Math.SQRT2:2的平方根,约等于 1.414
Math.abs(x); 返回x的绝对值,参数x是一个数字
函数
函数声明的语法:
function 函数名(参数1,参数2,...) {
函数体(代码块)
return 返回值;
}
函数表达式:
var fn = function (参数1,参数2,...) {
函数体
return 返回值;
};
推荐这种方式,因为函数声明方式会提前
箭头表达式:箭头函数表达式的语法比函数表达式更简洁,并且没有自己的this,arguments,super或 new.target。这些函数表达式更适用于那些本来需要匿名函数的地方,并且它们不能用作构造函数。
var Foo = () => {};
arguments.length:返回实参的数量
arguments.callee:返回当前函数块(就是函数本身)(匿名函数可以使用该属性实现递归调用)
this对象:在函数内部除了有arguments这个对象,还有个this对象,在绝大多数情况下,函数的调用方式决定了this的值。this不能在执行期间被赋值,并且在每次函数被调用时this的值也可能会不同。对于箭头函数,函数体内this对象就是定义时所在的对象,而不是调用时所在对象
return语句:终止函数的执行,并返回一个指定的值给函数调用者。
创建对象-原型模式
Prototype(原型):我们创建的每个函数都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象,这个对象的用途是包含所有实例共享的属性和方法。使用原型的好处是可以让所有对象实例共享它所包含的属性和方法。
constructor(构造函数):无论什么时候,只要创建了一个新函数,就会根据一组特定的规则为该函数创建一个prototype属性,这个属性指向函数的原型对象。在默认情况下,所有的原型对象都会自动获得一个constructor(构造函数)属性,这个属性是一个指向prototype属性所在函数的指针。
__proto__:Firefox、Safari和Chrome在每个对象上都支持一个属性__proto__;每个实例对象包含一个__proto__属性,该属性仅仅指向了Person.prototype;
Instanceof:前面提到过,在默认情况下,所有的原型对象最初都只包含constructor(构造函数)属性,而该属性也是共享的,因此可以通过对象实例访问。
console.log(person1.constructor === Person.prototype.constructor); // true
提到检测对象类型,还是instanceof操作符要更可靠一些。