JavaScript(简称“JS”) 是一种具有函数优先的轻量级,解释型或即时编译型的高级编程语言。虽然它是作为开发Web页面的脚本语言而出名的,但是它也被用到了很多非浏览器环境中,JavaScript 基于原型编程、多范式的动态脚本语言,并且支持面向对象、命令式和声明式(如函数式编程)风格。百度百科
//单行注释
/*
多行注释
*/
i = 1; //不建议这样定义
var i = "hello"; //函数作用域
let i = 'world'; //块作用域,ES6新增
const i = 3.14; //const用于定义一个只读常量,不能被修改,ES6新增
var
和let
关键字的区别,参考博客以下:
JavaScript不区分整数和浮点数,统一用Number表示。
123; // 整数123
3.14; // 浮点数0.456
1.2345e3; // 科学计数法
-99; // 负数
NaN; // NaN表示不是一个数字。NaN和所有值比较都返回false,包括与自己比较,只能用isNaN()方法判断
Infinity; // Infinity表示无限大,当数值超过了JavaScript的Number所能表示的最大值时,就表示为Infinity
字符串是以单引号’或双引号"括起来的任意文本,长度不可变。
'abc';
"Jacks";
`
多行
字符串
`;
let msg = `你好,${name}!`; //模板字符串,类似el表达式
\'
\n
\t
\u4e2d \u#### // unicode编码
\x41 //ASCLL码
...
常用方法:
str.length; //获取字符串长度
str.toUpperCase(); //转换成大写
str.toLowerCase(); //转换成小写
str.indexOf('t'); //t字符第一次出现的位置
str.substring(index); //截取字符串,从 index 所有开始到最后
str.substring(start,end); //截取字符串,左闭右开
true;
false;
常常配合运算符使用:
逻辑运算符 | 说明 |
---|---|
&& | 与运算,同为true,返回true |
|| | 或运算,有true,返回true |
! | 非运算,全为false,返回true |
比较运算符 | 说明 |
---|---|
a > b | a 大于 b 时返回 true |
a | a 小于 b 时返回 true |
… | … |
= | 赋值符号,可以改变变量的 值 和 类型 |
== | 等于,类型不一样,值一样,返回true。如:false==0,返回值为true |
=== | 绝对等于,类型一样,值一样,返回true。如:false === 0,返回值为false,建议使用。 |
null
表示值为空,注意与0
和""
区分,前者表示数字 0,后者表示长度为 0 的字符串。undefined
表示值未定义。数组是一组按顺序排列的集合,集合的每个值称为元素。JavaScript的数组可以包括任意数据类型,且长度是可变的。
[1, 2, 3.14, 'Hello', null, true];
new Array(1, 2, 3);
var arr = [1, 2, 3.14, 'Hello', null, true];
arr[0]; //取值
arr[0] = 1; //赋值
var arrays = [[1,2],[3,4],[5,6]]; //多维数组
arrays[0][0]; //取值
arrays[0][0] = 2; //赋值
常用方法:
arr.length;// 获取长度,赋值后可以改变数组长度
arr.indexOf(obj); //通过元素获取下标索引,字符串和数字有区分,如 1 和 "1"
arr.slice(); //截取一部分,类似str.substring,左闭右开
arr.push(); //在尾部添加元素
arr.pop(); //弹出尾部的一个元素
arr.unshift(); //在头部添加元素
arr.shift(); //从头部开始弹出一个元素
arr.sort(); //排序
arr.reverse(); //元素反转
arr.concat(arr); //拼接数组,并没有修改数组,只会返回一个新的数组。
arr.join('-'); //打印拼接数组,使用特定符号拼接
JavaScript 的对象是一种无序的集合数据类型,它由若干键值对组成。键的类型为字符串,值的类型是任意对象,键值对之间用逗号隔开,最后一个属性不需要加逗号。
var person = {
name: 'Jacks',
age: 22,
tags: ['js', 'web', 'mobile'],
city: 'Beijing',
hasCar: true,
zipcode: null
};
可以动态的删除或增加对象属性:
var student = {
name:"Jacks",
sex:"man",
score:90
}
student.name = "赤魂"; //对象赋值
delete student.score; //动态删除属性
student.email = "[email protected]"; //动态添加属性
"age" in person; //判断属性值是否在对象或对象的父类中,如toString可能不在对象属性中,而是在父类中
person.hasOwnProperty("age"); //判断对象中是否有某个属性,仅判断当前对象
Map
和Set
是ES6标准
新增的数据类型。
Map 是一组键值对的结构的集合。初始化 Map 需要一个二维数组,或者直接初始化一个空 Map。
var map = new Map([[key,value],[key,value],[key,value]]);
var map = new Map();
map.set(key,value); //添加,或修改
map.delete(key); //删除
map.keys();//获取所有的键,返回值是MapIterator
map.values();//获取所有的值,返回值是MapIterator
注意:
key
只能对应一个value
,对一个key
赋予多次value
,前面的值会被后面的值覆盖。 Set 是没有重复值的集合,要创建一个 Set,需要提供一个Array
作为输入,或者直接创建一个空 Set。
var set = new Set([3,1,1,1]);//可以去重
var set = new Set();
set.add(value); //添加
set.delete(value); //删除
set.has(value); //判断是否包含某个元素
if(条件){
执行体;
}else if(条件){
执行体;
}else{
执行体;
}
switch(n)
{
case 1:
执行代码块 1
break;
case 2:
执行代码块 2
break;
default:
与 case 1 和 case 2 不同时执行的代码
}
while(条件){
循环体;
}
do{
循环体;
}while(条件);
for(let i = 0; i < 100; i++){
循环体;
}
Array
可以采用下标循环,遍历 Map
和 Set
就无法使用下标。ES6标准
引入了新的 iterable
类型,Array
、Map
和 Set
都属于 iterable
类型。iterable
类型的集合可以通过新的 for ... of
循环来遍历,这也是 ES6
的新特性。1 遍历数组
arr.forEach(function (value){
执行体;
});//value就是arr里面的元素
for(let num in arr){
执行体;
}//num是索引位置
for(let value of arr){
执行体;
}//value是数组中的元素
2 遍历集合( Map 和 Set )
for(let value of map){
执行体;
}//value 为map中的键值对
for(let value of map.keys()){
执行体;
}//value 为map中的键
for(let value of map.values()){
执行体;
}//value 为map中的值
for(let x of set){
执行体;
}//x为set中的值
function 方法名 (参数列表){
函数体;
}
//方法一
function sum(x,y){
return x + y;
}
//方法二
var sum = function(x,y){
return x + y;
}//匿名函数,将返回值赋值给sum,通过sum(x,y)可以直接调用
sum(1,2); // 3
注意:
return
结束,然后返回结果。若没有执行 return
会返回 undefined
。JavaScript
的函数可以传递任意个参数,无关函数定义,也可以不传递参数。程序不会报错,但会影响最终结果,我们可以手动去处理。参数类型错误规避:手动抛出异常。
function sum(x,y){
if(typeof x !== 'number' || typeof y !== 'number'){
throw 'Not a number';
}
return x + y;
}
sum(1,2); //3
sum(1,"2"); //Not a number
typeOf
判断参数类型。多余参数处理:arguments
关键字和 rest
关键字[ES6新特性]。
function sum(x,y){
if(arguments.length == 2){
if(typeof x !== 'number' || typeof y !== 'number'){
throw 'Not a number';
}
return x + y;
}else{
throw '传参错误';
}
}
arguments
是由传入参数组成的数组,可用于判断处理多余参数。function sum(x,y,...rest){
console.log("x=>" + x);
console.log("y=>" + y);
console.log(rest);
}
rest
关键字代表可变长参数,可以将多余的参数作其他处理。参数定义为 ...rest
function myFunc(){
var x = 1;
return x;
}
x = x + 2;//Uncaught ReferenceError:x is not defined
function myFunc1(){
var x = 1;
function myFunc2(){
var y = x + 1;
console.log(y);
}
myFunc2();
}
myFunc1();
xxx is not defined
var 关键字存在的问题
function myFunc(){
for(var i = 0; i < 5;i++){
console.log(i);//0 1 2 3 4
}
console.log(i + 1);// 6
}
for
循环中的变量 i
,可以在 for
循环体外被调用,这不是我们想要的结果。ES6
提出的let
关键字解决上述问题。let
关键字去定义局部域的变量。function myFunc(){
for(let i = 0; i < 5;i++){
console.log(i);//0 1 2 3 4
}
console.log(i + 1);// i is not defined
}
如果直接在标签中用
var
定义一个变量,则这个变量会被默认绑定到 windows
对象上,变量名与windows
属性名相同的话,会覆盖掉原来的属性。如下所示:
alert(1); //浏览器会弹出 1 的消息框
var alert = 1;
alert(1); // alert is not a function
为了减少上面所示的冲突,一般把全局变量放到自己定义的唯一空间名字中,降低全局命名的冲突问题,比如JQuery
的自定义空间名为$
。如下自定义全局域:
var mySpace = {}; //自定义全局域
mySpace.name = "Jacks"; //动态添加变量
mySpace.add = function(a,b){
return a + b;
};//动态添加函数
方法的本质是定义在对象中的函数,是对象的一个属性,如下所示:
var person={
name: 'Jacks',
birth: 2000,
age:function(){
var now = new Date().getFullYear();
return now - this.birth;
}
}
person.age; //返回方法体,属性值
person.age(); //20,调用方法一样要加括号
将方法从对象中拆分出来,可以如下表示:
var person={
name: 'Jacks',
birth: 2000,
age:getAge
}
function getAge(){
var now = new Date().getFullYear();
return now - this.birth;
}
person.age;//20
getAge();//NaN,this指向调用者,直接调用这个方法的话,指向的是windows对象
getAge.apply(person,[]);//20,可以用方法去调用apply方法,将this指向指定的对象。
var now = new Date();
now.getFullYear();//年份
now.getMonth();//月,0~11
now.getDate();//日
now.getHours();//时
now.getMinutes();//分
now.getSeconds();//秒
now.getDay();//星期
now.getTime();//时间戳,从格林威治时间 1970年1月1日 00:00:00 到现在的毫秒数
now.toLocaleString();//转换为本地时间
now.toGMTString();//转换为格林威治时间
在JavaScript
中一切皆为对象,任何JavaScript
支持的类型都可以用JSON
来表示。
JSON格式规范如下:
{}
表示[]
表示key : value
形式表示var person={
name:"Jacks",
age:22
}
var jsonStr = JSON.stringify(person);//将对象转换成JSON字符串
var obj = JSON.parse('{"name":"Jacks","age":22}');//将JSON字符串转换为对象
JSON 字符串和 JavaScript 对象比较。
var obj = {name:"Jacks",age:22}; //js对象
var jsonStr = '{"name":"Jacks","age":22}'; //json字符串
…
常见的面向对象编程语言如Java
,类是模板,对象是实例。JavaScript
不区分类和实例的概念,而是通过原型(prototype)来实现面向对象编程。JavaScript的原型是一个链式结构,详情参考以下博客:
ES6
中引入了 class
关键字来定义一个原型类,通过 new
关键字将原型实例化。class Student{
//构造器
constructor(name){
this.name = name;
}
//方法
hello(){
console.log("hello," + this.name);
}
}
var Jacks = new Student("Jacks");
var Cain = new Student("Cain");
Jacks.hello(); //hello,Jacks
Cain.hello(); //hello,Cain
JavaScript
的继承通过extends
关键字来实现。class Person{
constructor(name){
this.name = name;
}
hello(){
console.log("hello," + this.name);
}
}
class Student extends Person{
constructor(name,grade){
super(name); //继承父类构造
this.grade = grade;
}
getGrade(){
console.log("成绩为:" + this.grade);
}
}
var Jacks = new Student("Jacks",50);
Jacks.hello(); //hello,Jacks
Jacks.getGrade(); //50
window
对象代表浏览器,以获取浏览器的一些属性。window.alert(1); //浏览器弹窗
window.innerHeight; //浏览器内部高度
window.innerWidth; //浏览器内部宽度
window.outerHeight; //浏览器外部宽度
window.outerWidth; //浏览器外部宽度
...
navigator
封装了浏览器的信息,可以获取这些信息,但不建议用navigator
对象来判断和编写代码。navigator.appName; //当前应用的名称
navigator.appVersion; //版本号
navigator.userAgent; //用户浏览器
navigator.platform; //系统版本
...
screen
对象代表屏幕,可以获取屏幕的尺寸。screen.width; //屏幕宽度,px
screen.height; //屏幕高度,px
location
对象代表当前页面的URL
信息location; //返回 URL 信息
host: "www.baidu.com" //主机
href: "https://www.baidu.com/" //指向连接
protocol: "https:" //协议
reload: ƒ reload() //重新加载(刷新)
location.assign("https://blog.csdn.net/qq_44713454"); //重定向到参数连接
document
代表当前的页面,可以获取具体的文档树节点。document.title; //标题
document.cookie; //获取当前网页的cookie
document.getElementById(); //根据id获取节点
<dl id="app">
<dt>Javadt>
<dd>JavaSEdd>
<dd>JavaEEdd>
dl>
<script>
var dl = document.getElementById("app");
<script>
history
对象代表浏览器的历史记录。history.back(); //返回上一页面
history.forward(); //前进到下一页面
浏览器网页就是一个 DOM 树形结构,可以对数节点进行 CRUD 操作。
<h1>DOM树h1>
p1p>
p2p>
div>
<script>
//对应css选择器
var root = document.getElementById("root");
var hl = document.getElementByTagName(h1);
var p1 = document.getElementById("p1");
var p2 = document.getElementByClassName("p2");
var children = root.children; //获取节点下的所有子节点
//root.firstChild;
//root.lastChild;
//root.children[index]; //获取指定索引的字节点
script>
7.2 更新节点
div>
<script>
var id1 = document.getElementById("id1");
id1.innerText="123"; //修改文本
id1.innerHTML = '123'; //可以解析HTML文本标签
id1.style.color = 'red'; //修改css属性,颜色
id1.style.fontSize('200px'); //修改css属性,字体大小
script>
7.3 删除节点
- 先获取父节点,再用父节点删除自己。
<h1>DOM树h1>
p1p>
p2p>
div>
<script>
var p1 = document.getElementById("p1");
var root = p1.parentElement; //找到父节点
root.removeChild(p1); //删除节点
script>
- 可以用
father.children
获取出father
节点的所有子节点,这是一个数组,可以使用索引进行选择,如
var root = document.getElementById("root");
root.remove(root.children[0]); //删除第一个节点
- 需要注意的是,删除节点是动态的过程,也就是说删除若干节点后,剩余节点的索引位置是变化的。
7.3 插入节点
当我们获取到一个节点时,如果这个节点是空节点,就可以使用 innerHTML
来添加新的节点,这样做的话,新添加的节点会覆盖掉原来的节点。如果这个节点不为空,则不能使用 innerHTML
来添加新节点。这时,可以使用 append
来追加节点。
7.3.1 插入(移动)一个已有节点
<p id="js">JavaScriptp>
<div id="list">
<p id="se">JavaSEp>
<p id="ee">JavaEEp>
<p id="me">JavaMEp>
div>
<script>
var js = document.getElementById("js");//已存在节点
var list = document.getElementById("list");
list.append(js);//将 js 节点追加到 list 节点中,是一个移动的过程。
script>
7.3.2 插入 JavaScript 新建的节点
<div id="list">
<p id="se">JavaSEp>
<p id="ee">JavaEEp>
<p id="me">JavaMEp>
div>
<script>
var np = document.createElement("p"); //创建一个 p 标签节点
np.id = "np"; //设置id
np.innerText = "hello"; //设置文本
list.append(np); //追加新节点
script>
7.3.4 插入 css 属性
<div id="list">
<p id="se">JavaSEp>
<p id="ee">JavaEEp>
<p id="me">JavaMEp>
div>
<script>
var se = document.getElementById('se');
//通过 setAttribute(key,value) 可以设置任意值
se.setAttribute('style','color: red;'); //添加css属性
var body = document.getElementsByTagName('body');
body[0].style.backgroundColor = 'orange'; //添加css属性
script>
7.3.3 指定节点插入位置
<div id="list">
<p id="se">JavaSEp>
<p id="ee">JavaEEp>
<p id="me">JavaMEp>
<p id="js">JavaScriptp>
div>
<script>
var ee = document.getElementById('ee');
var js = document.getElementById('js');
var root = document.getElementById('list'); //使用父节点进行插入
list.insertBefore(js,ee); //指定将 js 节点插入到 ee节点前面
script>
说明:初识 JavaScript
,本片博文讲解并不全面,仅供参考。