JavaScript是前端工程师必备的技能之一,也是基础中的基础,但是我本人又是个不太重视基础的人,这就导致我在写代码的时候,总会忘记这该怎么写,或者在面试的时候,被问及原理或者基础的语法的时候,总是语塞,而且近几年JavaScript的发展很快,有统治全世界的架势,这也就是为什么我要写这篇文章的原因,让我们一步一步来,坚实的地基才会盖得起高楼大厦。
JavaScript 介绍
JavaScript是一种可以用来给网页增加交互性的编程语言,现在也被用于网络服务器(非浏览器环境),如Node.js。
JavaScript分为三部分,ECMAScript(JavaScript核心语音)、DOM(文档对象模型)和BOM(浏览器对象模型)。ECMAScript,描述了该语言的语法和基本对象。DOM,描述处理网页内容的方法和接口。BOM,提供了独立于内容而在浏览器窗口之间进行交互的对象和方法。
ECMAScript是由ECMA TC39委员会进行标准化的一门编程语言,规定了 JavaScript 脚本的核心语法,如 数据类型、关键字、保留字、运算符、对象和语句等,它不属于任何浏览器,现在最新版本是ECMAScript 6.0。
DOM是“ Document Object Model ”的缩写,简称“文本对象模型”,定义了 JavaScript 操作 HTML 文档的接口,提供了访问 HTML 文档(如body、form、div、textarea等)的途径以及操作方法,通过调用DOM树上对象的方法可以操纵这些对象。
BOM 是“ Browser Object Model ”的缩写,简称“ 浏览器对象模型 ”,定义了 JavaScript 操作浏览器的接口,提供了访问某些功能(如浏览器窗口大小、版本信息、浏览历史记录等)的途径以及操作方法。
基础
- 变量名必须以字母、$、_开头
- 定义了的变量没有赋值,会有个默认值undefined
- 变量可以存储两种类型的值,原始值和引用值
- 原始值:Undefined、Null,Boolean、Number、String
- 特殊值:NaN,会发生在类型转换失败时
- 字符串转换:toString()方法,Number转换时加的参数可以是2、8、10(默认)、16,分别转换成二进制、八进制、十进制、十六进制字符串,数组转换时,会变成用“ , ”连接的字符串,
String()
与toString()
的唯一区别是对 null 和 undefined 值强制类型转换可以生成字符串而不引发错误 - 数字转换: parseInt()、parseFloat(),转换的是部分数值如:
parseFloat("123end")
结果为123,而Number("123end")
结果为NaN - Boolean转换:Boolean(),除了空串、null、数字 0、undefined 或 null,它将返回 false,其他都是true
- Object对象,所有对象都由这个对象继承,Object对象里的所有属性和方法都会出现在其他的对象中,因此学习Object对象很重要。
Object对象
Object对象,所有对象都由这个对象继承,Object对象里的所有属性和方法都会出现在其他的对象中,因此学习Object对象很重要。
Object对象常见的属性:
- constructor,指向原始的Object()函数,如
var test = new Array(); test.constructor == Array
返回true; - Prototype,它默认返回 Object 对象的一个实例,使您有能力向对象添加属性和方法,如
Array.prototype.dd = "33"; var test = new Array(); console.log(test.dd);
结果就是”33”,注意先后顺序; - hasOwnProperty,判断对象是否有某个特定的属性,必须用字符串指定该属性,而且是自身属性,如上记2的例子中,
test.hasOwnProperty("dd");
返回的是false; - isPrototypeOf,判断该对象是否为另一个对象的原型,如
var test = new Array(); Array.prototype.isPrototypeOf(test)
返回true;
Array 对象
Array 对象用于在单个的变量中存储多个值,也是常用的对象,所以在这里单列出来。
创建数组的方法:
var arr = ["a", "b", "c"];
(推荐)var arr = new Array(3); arr[0] = "a"; arr[1] = "b"; arr[2] = "c"
var arr = new Array("a", "b", "c");
Array 对象常用方法:
- concat(),连接两个或更多的数组,并返回结果。如
var arr1 = [1, 2, 3]; var arr2 = [4, 5]; arr1.concat(arr2);
结果输出是[1,2,3,4,5], 需要注意的是arr1和arr2是不变的; - join(), 把数组的所有元素放入一个字符串, 元素通过指定的分隔符进行分隔。如
var arr = [1, 2, 3]; arr.join(".");
返回结果是”1.2.3”; - pop(), 删除并返回数组的最后一个元素。如
var arr = [1, 2, 3]; arr.pop();
返回删除的最后一个元素 3, 注意的是,此时的arr已经没有了最后一个元素,console.log(arr);
结果是[1, 2]; - push(), 可向数组的末尾添加一个或多个元素,并返回新的长度。如
var arr = ["a", "b", "c"]; arr.push("d");
结果是4, 注意此时的arr已经多了一个元素,console.log(arr);
结果是[“a”, “b”, “c”,”d”]; - reverse(),颠倒数组中元素的顺序。如
var arr = [1, 2, 3]; arr.reverse();
返回的结果是[3, 2, 1], 注意此时的arr已经改变了,console.log(arr);
结果是[3, 2, 1]; - shift(),删除第一个元素,并返回刚才删除的第一个元素的值。如
var arr = [1, 2, 3]; arr.shift();
返回的结果是1, 注意此时的arr已经改变了,console.log(arr);
结果是[2, 3]; - slice(), 从已有的数组中返回选定的元素。有两个参数,start和end,开始和结束的位置,当只有一个参数时,默认end是最后,如
var arr = [1, 2, 3]; arr.slice(1);
返回的是[2, 3], 负值时,从尾部开始计算,如var arr = [1, 2, 3]; arr.slice(-1);
返回的结果是[3], 注意该方法返回的是字数组,不会改变原来的数组; - splice(), 从数组中添加/删除项目,然后返回被删除的项目, 该方法有三个参数,index:必须,整数,添加或删除项目的位置,howmany:必须,要删除的项目数量,设置为0时,不会删除,item1,…,item2:可选,向数组添加的新项目,如
var arr =[1, 2, 3]; arr.splice(0, 1);
返回结果是[1],删除了第一个项目,注意此时的arr已经改变了,console.log(arr);
结果是[2, 3],var arr =[1, 2, 3]; arr.splice(2, 0, 4, 5);
返回的结果是[],console.log(arr);
结果是[1, 2, 4, 5, 3],此时应该注意的是splice和slice的区别;
- concat(),连接两个或更多的数组,并返回结果。如
String 对象
String对象也就是存数字符串的,下面的方法是最常用的也是最容易混淆的。
String 对象常用方法:
- charAt(),返回指定位置的字符。该方法有一个位置参数,如
var str = "Hello May"; str.charAt(6);
结果是”M”,如果参数不在0和string.length之间,将返回空串; - indexOf(), 返回指定的字符串在在字符串中首次出现的位置。该方法有俩参数,searchvalue:必须,要检索的字符串,fromindex:可选,开始检索的位置,如果参数不在0和string.length之间,将从头开始检索。如
var str = "Hello May"; str.indexOf("M");
结果是6,var str = "Hello May"; str.indexOf("M", 7);
结果是-1,找不到该字符串时,返回结果为-1; - lastIndexOf(),与indexOf()方法相反,返回最后一个出现的位置;
- match(),在字符串内检索指定的值,或找到一个或多个正则表达式的匹配。参数,必须,可以是要检索的字符串,也可以是要匹配的正则表达式。如
var str = "Hello May"; str.match("May");
返回的结果是[“May”],var str = "Hello May"; str.match(/\d+/g);
结果就是null; - replace(), 在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。如
var str = "Hello World"; str.replace("World", "May");
结果返回”Hello May”,注意的是,此时arr没有被改变,console.log(str);
结果是”Hello World”; - split(),把一个字符串分割成字符串数组。该方法有两个参数,separator:必须,要分割的字符串或正则表达式,howmany:可选,指定返回数组的最大长度。如
var str = "How are you?"; str.split(" ", 2);
返回结果是[“How”, “are”]; - substr(),在字符串中抽取从指定下标开始的指定数目的字符(包括开始下标位置的字符)。该方法有俩参数,start:必须,要抽取的子串下标,可以是负数,-1是最后一个字符,length:可选,子串中的字符数,必须是正整数。如
var str = "Hello World"; str.substr(5);
返回的结果是” World”,var str = "Hello World"; str.substr(5, 4);
返回结果是” Wor”,找不到的情况下返回空串。 - substring(),提取字符串中介于两个指定下标之间的字符。与substr()不同,两个参数分别为开始和结束的下标,并且不接受负值。
- charAt(),返回指定位置的字符。该方法有一个位置参数,如
RegExp 对象
正则表达式是被用来匹配字符串中的字符组合的模式,被用于RegExp 的exec和test方法以及 String 的 match、replace、search 和 split 方法,用到的地方很多,也不好理解,所以要慢慢消化了。
创建正则表达式:
var re = /ab+c/;
var re = new RegExp("ab+c");
匹配方法:
- 使用简单的模式,如/abc/,只会匹配有字符串”abc”顺序出现的字符串。
使用特殊字符
修饰符
- i: 不区分大小写匹配
- g: 全局匹配
- m: 多行匹配
方括号(用于匹配某个范围内的字符)
- [abc]: 匹配方括号之间的任何字符
- [^abc]: 匹配不在方括号之间的任何字符
- (red|blue|grenn): 匹配任何指定的选项
元字符
- .: 匹配除了换行和结束符以外的其他单个字符
- \w: 匹配单词字符(字母、数字、下划线)
- \W: 匹配非单词字符
- \d: 匹配数字
- \D: 匹配非数字
- \s: 匹配空白字符
- \S: 匹配非空白字符
- \b: 匹配单词边界
- \B: 匹配非单词边界
量词
- n+: 匹配包含一个或多个字符n的字符串
- n*: 匹配包含0个或多个字符n的字符串
- n?: 匹配包含0个或一个字符n的字符串
- n{X}: 匹配含有X个n的字符串
- n{X,Y}: 匹配含有X到Y个n的字符串
- n{X,}: 匹配至少X个n的字符串
- n$: 匹配以n结尾的字符串
- ^n: 匹配以n开头的字符串
- ?=n: 匹配任何其后紧跟指定字符串n的字符串
- ?!n: 匹配其后没有紧跟指定字符串n的字符串