JS基础1-语言部分

一、 入门

1、 JS代码书写的位置

  • 写在行内
<input type="button" value="按钮" onclick="alert('Hello World')" />
  • 写在script标签中
<head>
  <script>
    alert('Hello World!');
  </script>
</head>
  • 写在外部js文件中,在页面引入
<script src="main.js"></script>

注意点: 引用外部js文件的script标签中不可以写JavaScript代码

2、变量

(1) 什么是变量

  • 什么是变量

    变量是计算机内存中存储数据的标识符,根据变量名称可以获取到内存中存储的数据

  • 为什么要使用变量

    使用变量可以方便的获取或者修改内存中的数据

(2) 如何使用变量

  • var声明变量
var age;
  • 变量的赋值
var age;
age = 18;
  • 同时声明多个变量
var age, name, sex;
age = 10;
name = 'zs';
  • 同时声明多个变量并赋值
var age = 10, name = 'zs';

(3) 变量在内存中的存储

var name = '张三';
var age = 18;

(4)规则 - 必须遵守的,不遵守会报错

  • 规则 - 必须遵守的,不遵守会报错

    • 由字母、数字、下划线、$符号组成,且不能以数字开头
    • 不能是关键字和保留字,例如:for、while。
    • 区分大小写
  • 规范 - 建议遵守的,不遵守不会报错

    • 变量名必须有意义
    • 遵守驼峰命名法。(首字母小写,后面单词的首字母需要大写。例如:userName、userPassword)
  • 下面哪些变量名不合法

    a     
    1
    age18
    18age
    name
    $
    $name
    _sex
    &sex
    theworld  
    theWorld
    

(5) 案例

  1. 交换两个变量的值
var a = '1';
var b = '2';
//  借助第三个变量
var c = a;
a=b;
b=c;
console.log(a, b);
  1. 不使用临时变量,交换两个数值变量的值
//第二种方式
var num1 = 10;
var num2 = 20;
//计算的方式:累加,然后相减
num1 = num1 + num2;//num1的结果是30
num2 = num1 - num2;//num2的结果是10
num1 = num1 - num2;//num1的结果是20
console.log(num1);
console.log(num2);

3、 数据类型

(1) 简单数据类型

Number、String、Boolean、Undefined、Null

获取变量的类型

typeof

var age = 18;
console.log(typeof age);  // 'number'
Number类型
  • 数值字面量:数值的固定值的表示法

    110 1024 60.5

  • 进制

如果字面值中的数值超出了范围,那么前导零将被忽略,后面的数值将被当作十进制数值解析

二进制
    var num = 0000 0001;
    数字序列范围:0~1
    
八进制
    var num1 = 07;   // 对应十进制的7
    var num2 = 019;  // 对应十进制的19
    var num3 = 08;   // 对应十进制的8
    数字序列范围:0~7

十进制
    var num = 9;
    数字序列范围:0~9
十六进制
    var num = 0xA;
    数字序列范围:0~9以及A~F
  • 浮点数
    • 浮点数的精度问题
浮点数
    var n = 5e-324;   // 科学计数法  5乘以10的-324次方  
浮点数值的最高精度是 17 位小数,但在进行算术计算时其精确度远远不如整数
   var result = 0.1 + 0.2;    // 结果不是 0.3,而是:0.30000000000000004
   console.log(0.07 * 100);
   不要判断两个浮点数是否相等
  • 数值范围

    最小值:Number.MIN_VALUE,// 这个值为: 5e-324  5乘以10的-324次方
    最大值:Number.MAX_VALUE,// 这个值为: 1.7976931348623157e+308
    无穷大:Infinity
    无穷小:-Infinity
    
String类型

'abc' "abc"

  • 字符串字面量

    '程序猿','程序媛', "程序猿"

    思考:如何打印以下字符串。
    我是一个 "正直" 的人
    我很喜欢 " '程序猿' "

  • 转义符

var s = '我很喜欢   \" \'程序猿\'  \"';
console.log(s);
  • 字符串长度

length属性用来获取字符串的长度

var str = '程序猿 Hello World';
console.log(str.length);
  • 字符串拼接

字符串拼接使用 + 连接

console.log(11 + 11);
console.log('hello' + ' world');
console.log('100' + '100');
console.log('11' + 11);
console.log('male:' + true);
  1. 两边只要有一个是字符串,那么+就是字符串拼接功能
  2. 两边如果都是数字,那么就是算术功能。
Boolean类型
  • Boolean字面量: true和false,区分大小写
  • 计算机内部存储:true为1,false为0
Undefined和Null
  1. undefined表示一个声明了没有赋值的变量,变量只声明的时候值默认是undefined
  2. null表示一个空,变量的值如果想为null,必须手动设置

注: 关于undefined和null是一个大问题,面试中很容易被问到,后面的高级部分详解;

(2) 复杂数据类型

​ Object

题外话

如何使用谷歌浏览器,快速的查看数据类型?

字符串的颜色是黑色的,数值类型是蓝色的,布尔类型也是蓝色的,undefined和null是灰色的

console.log('ss', 2, null, undefined, true);

4、 注释

单行注释

用来描述下面一个或多行代码的作用

// 这是一个变量
var name = 'zs';

多行注释

用来注释多条代码

/*
var age = 18;
var name = 'zs';
console.log(name, age);
*/

二、 数据类型转换

1、 转换成字符串类型

  • toString()

    var num = 5;
    console.log(num.toString());
    
  • String()

    var s = null;
    console.log(s.toString());
    console.log(String(s));
    
    // String()函数存在的意义:有些值没有toString(),
    // 这个时候可以使用String()。比如:undefined和null
    
  • 拼接字符串方式

    num + "",当 + 两边一个操作符是字符串类型,一个操作符是其它类型的时候,会先把其它类型转换成字符串再进行字符串拼接,返回字符串

2、 转换成数值类型

  • Number()

    var a = Number('1');
    var b = Number(1);
    var c = Number('c');
    var d = Number(null);
    var e = Number(undefined);
    
    console.log(a, b, c, d, e); // 1 1 NaN 0 NaN
    
    // Number()可以把任意值转换成数值,如果要转换的字符串中有一个不是数值的字符,返回NaN
    
  • parseInt()

    var a = parseInt('1.2df');
    var b = parseInt(1);
    var c = parseInt('c12');
    var d = parseInt(null);
    var e = parseInt(undefined);
    
    console.log(a, b, c, d, e); //1 1 NaN NaN NaN
    
    // 如果第一个字符是数字会解析,直到遇到非数字结束
    // 如果第一个字符不是数字或者符号就返回NaN
    
  • parseFloat()

    var a = parseFloat('1.2df');
    var b = parseFloat('1.3.4');
    var c = parseFloat('c12');
    var d = parseFloat(null);
    var e = parseFloat(undefined);
    
    console.log(a, b, c, d, e); //1.2 1.3 NaN NaN NaN
    
    // parseFloat() 把字符串转换成浮点数
    // parseFloat()和parseInt非常相似,
    // 不同之处在与parseFloat会解析第一个 . 遇到第二个.或者非数字结束
    // 如果解析的内容里只有整数,解析成整数
    
  • +,-,-0 等运算

    var str = '500';
    console.log(+str);        // 取正
    console.log(-str);        // 取负
    console.log(str - 0);   
    

3、 转换成布尔类型

  • Boolean()
var a = Boolean('0');
var b = Boolean(0);
var c = Boolean('1');
var d = Boolean(null);
var e = Boolean(undefined);
var f = Boolean(NaN);

console.log(a, b, c, d, e, f); //true false true false false false

// 0、''(空字符串) 、null、 undefined 、NaN 会转换成false  其它都会转换成true

三、 操作符

表达式:值和操作符,运算会有一个结果;

同时,表达式中的每个数值,又称为 子表达式

1、 算术运算符

+ - * / %  

2、 一元运算符 *

一元运算符:只有一个操作数的运算符

5 + 6 两个操作数的运算符 二元运算符

++ 自身加1

-- 自身减1

  • 前置++

    var num1 = 5;
    ++ num1; 
    
    var num2 = 6;
    console.log(num1 + ++ num2); //13
    
  • 后置++

    var num1 = 5;
    num1 ++;    
    var num2 = 6 
    console.log(num1 + num2 ++); //12
    
  • 猜猜看

    var a = 1; 
    var b = ++a + ++a; 
    console.log(b); //5
    
    var a = 1; 
    var b = a++ + ++a; 
    console.log(b);//4
    
    var a = 1; 
    var b = a++ + a++; 
    // console.log(b);  // 3
    
    var a = 1; 
    var b = ++a + a++; 
    console.log(b);//4
    

    总结
    前置++:先加1,后参与运算
    后置++:先参与运算,后加1

    后置++ 运算的两个条件,满其一就会执行

    1:整个表达式结束;2表达式没结束但是又被使用了;

    上面两个理解后,下面两个自通
    前置-- :先减1,后参与运算
    后置-- :先参与运算,后减1

3、 逻辑运算符(布尔运算符) *

&& 与 两个操作数同时为true,结果为true,否则都是false
|| 或 两个操作数有一个为true,结果为true,否则为false
!  非  取反

var a = 1;
var b = 2;
var c = 0;

console.log(a || b); //1
console.log(b || a); //2
console.log(c && a); //0
console.log(a || c && b); //1

// JS逻辑运算中的逻辑或和逻辑与的运算结果:
// 决定整个表达式的子表达式的值

4、 关系运算符(比较运算符)

<  >  >=  <= == != === !==
==与===的区别:==只进行值得比较,===类型和值同时相等,则相等

var result = '55' == 55;    // true
var result = '55' === 55;   // false 值相等,类型不相等
var result = 55 === 55;     // true

5、 赋值运算符

= += -= *= /= %=

例如:
var num = 0;
num += 5;   //相当于  num = num + 5;

6、 运算符的优先级 *

优先级从高到底
1. ()  优先级最高
2. 一元运算符  ++   --   !
3. 算数运算符  先*  /  %   后 +   -
4. 关系运算符  >   >=   <   <=
5. 相等运算符   ==   !=    ===    !==
6. 逻辑运算符 先&&   后||
7. 赋值运算符
// 练习1:
var s = 4 >= 6 || '人' != '阿凡达' && !(12 * 2 == 144) && true
console.log(s); //true

// 练习2:
var num = 10;
var f = 5 == num / 2 && (2 + 2 * num)
console.log(f.toString() === 22) //false

四、 流程控制

程序的三种基本结构

顺序结构: 从上到下执行的代码就是顺序结构

程序默认就是由上到下顺序执行的

分支结构:根据不同的情况,执行对应代码

循环结构:循环结构:重复做一件事情

1、 分支结构

if语句

语法结构

if (/* 条件表达式 */) {
  // 执行语句
}

if (/* 条件表达式 */){
  // 成立执行语句
} else {
  // 否则执行语句
}

if (/* 条件1 */){
  // 成立执行语句
} else if (/* 条件2 */){
  // 成立执行语句
} else if (/* 条件3 */){
  // 成立执行语句
} else {
  // 最后默认执行语句
}

案例

//获取两个数字中的最大值
var num1 = 100;
var num2 = 20;
if(num1 > num2){
    console.log(num1);
}else{
    console.log(num2);
}
// 判断一个数是偶数还是奇数
var n = 10;
if(n % 2 == 0){
    console.log('偶数');
}else{
    console.log('奇数');
}
    /*
    * 例子:
    * 获取考试的分数,如果成绩是在90(含)分以上的,则显示级别:A
    * 如果成绩是大于等于80的则:B
    * 如果成绩是大于等于70的则:C
    * 如果成绩是大于等于60的则:D
    * 如果成绩是小于60的则:E
    *
    */
    var score = 91;
    if (score >= 90) {
        console.log("A");
    } else if (score >= 80) {
        console.log("B");
    } else if (score >= 70) {
        console.log("C");
    } else if (score >= 60) {
        console.log("D");
    } else {
        console.log("E");
    }
//判断闰年
var n = 2016;
if(n % 4 == 0){
    if(n % 100 != 0){
        console.log('闰年');
    }else if(n % 400 == 0){
        console.log('闰年');
    }else{
        console.log('平年');
    }
}else{
    console.log('平年');
}
三元运算符
表达式1 ? 表达式2 : 表达式3
是对if……else语句的一种简化写法

案例:

// 是否年满18岁
var age = 18;
var s = age >= 18 ? 'Yes' : 'no';
console.log(s);
// 从两个数中找最大值
var a1 = 110;
var a2 = 19;
var s = a1 > a2 ? a1 : a2;
console.log(s);
switch语句

语法格式:

switch (expression) {
  case 常量1:
    语句;
    break;
  case 常量2:
    语句;
    break;
  …
  case 常量n:
    语句;
    break;
  default:
    语句;
    break;
}

/*
* 执行过程:
* 获取表达式的值,和值1比较,相同则执行代码1,遇到break跳出整个语句,结束
* 如果和值1不匹配,则和值2比较,相同则执行代码2,遇到break跳出整个语句,结束
* 如果和值2不匹配,则和值3比较,相同则执行代码3,遇到break跳出整个语句,结束
* 如果和值3不匹配,则和值4比较,相同则执行代码4,遇到break跳出整个语句,结束
* 如果和之前的所有的值都不一样,则直接执行代码5,结束
*/
break可以省略,如果省略,代码会继续执行下一个case
switch 语句在比较值时使用的是全等操作符, 因此不会发生类型转换(例如,字符串'10' 不等于数值 10)
/* *
* 判断这个人的成绩的级别:
* 如果是A,则提示,分数在90分以上
* 如果是B,则提示,分数在80分以上
* 如果是C,则提示,分数在70分以上
* 如果是D,则提示,分数在60分以上
* 否则提示,不及格
* */

var jiBie = "B";
switch (jiBie){
    case "A" : 
        console.log("分数在90分以上的");
        break;
    case "B" : 
        console.log("分数在80分以上的");
        break;
    case "C" : 
        console.log("分数在70分以上的");
        break;
    case "D" : 
        console.log("分数在60分以上的");
        break;
    default :
        console.log("不及格");
}

2、 循环结构

在javascript中,循环语句有三种,while、do..while、for循环。

(1) while语句

基本语法:

// 当循环条件为true时,执行循环体,
// 当循环条件为false时,结束循环。
while (循环条件) {
  //循环体
}

案例1:计算1-100之间所有数的和

// 初始化变量
var i = 1;
var sum = 0;
// 判断条件
while (i <= 100) {
  // 循环体
  sum += i;
  // 自增
  i++;
}
console.log(sum);

案例2:打印100以内 7的倍数

var i = 1;
while(i < 100){
    if(i % 7 == 0){
        console.log(i);
    }
    i++;
}

案例3:打印100以内所有偶数

var i = 1;
while(i <= 100){
    if(i % 2 == 0){
        console.log(i);
    }
    i++;
}

案例4:打印100以内所有偶数的和

var i = 1;
var s = 0;
while(i <= 100){
    if(i % 2 == 0){
        s = s + i;
    }
    i++;
}
console.log(s);

(2)do...while语句

do..while循环和while循环非常像,二者经常可以相互替代,

但是do..while的特点是不管条件成不成立,都会执行一次。

do {
  // 循环体;
} while (循环条件);

案例:计算1+2+3+4+……+99+100 的结果

// 初始化变量
var i = 0;
var sum = 1;
do {
  sum += i;//循环体
  i++;//自增
} while (i <= 100);//循环条件

(3) for语句

while和do...while一般用来解决无法确认次数的循环。for循环一般在循环次数确定的时候比较方便

for循环语法:

// for循环的表达式之间用的是;号分隔的,千万不要写成,
for (初始化表达式1; 判断表达式2; 自增表达式3) {
  // 循环体4
}

执行顺序:1243 ---- 243 -----243(直到循环条件变成false)

  1. 初始化表达式
  2. 判断表达式
  3. 自增表达式
  4. 循环体
//打印1-100之间所有数
for(var i = 1; i <= 100; i++){
    console.log(i);
}

//求1-100之间所有数的和
var s = 0;
for(var i = 0; i <= 100; i++){
    s += i;
}
console.log(s);

//求1-100之间所有偶数的和
var s = 0;
for(var i = 1; i <= 100; i++){
    if(i % 2 == 0){
        s += i;
    }
}
console.log(s);

//打印正方形
var start = '';
for (var i = 0; i < 10; i++) {
  for (var j = 0; j < 10; j++) {
    start += '* ';
  }
  start += '\n';
}
console.log(start);

//打印直角三角形
var start = '';
for (var i = 0; i < 10; i++) {
  for (var j = i; j < 10; j++) {
    start += '* ';
  }
  start += '\n';
}
console.log(start);

//打印9*9乘法表
var str = '';
for (var i = 1; i <= 9; i++) {
  for (var j = i; j <=9; j++) {
    str += i + ' * ' + j + ' = ' + i * j + '\t';
  }
  str += '\n';
}
console.log(str);

(4) continue和break

break:立即跳出整个循环,即循环结束,开始执行循环后面的内容(直接跳到大括号)

continue:立即跳出当前循环,继续下一次循环(跳到i++的地方)

案例1:求1-100之间不能被7整除的整数的和(用continue)

var s = 0;
for(var i = 0; i < 100; i++){
    if(i % 7 == 0){
        continue;
    }
    s += i;
}
console.log(s);

案例2:求200-300之间所有的奇数的和(用continue)

var s = 0;
for(var i = 200; i <= 300; i++){
    if(i % 2 == 0){
        continue;
    }else{
        s += i;
    }
}
console.log(s);

案例3:求200-300之间第一个能被7整数的数(break)

for(var i = 200; i <= 300; i++){
    if(i % 7 == 0){
        console.log(i);
        break;
    }
}

五、 JS中特殊的对象-数组

所谓数组,就是将多个元素(通常是同一类型)按一定顺序排列放到一个集合中,那么这个集合我们就称之为数组。

1、 数组的创建

// 字面量方式创建数组
var arr1 = []; //空数组
// 创建一个包含3个数值的数组,多个数组项以逗号隔开
var arr2 = [1, 3, 4]; 
// 创建一个包含2个字符串的数组
var arr3 = ['a', 'c']; 
console.log(arr1);
console.log(arr2);

// 构造函数方式创建数组
var a1 = new Array(); //空数组
var a2 = new Array('1', 2, 'h'); //包含三个元素的数组
console.log(a1);
console.log(a2);

// 可以通过数组的length属性获取数组的长度
console.log(arr3.length);
// 可以设置length属性改变数组中元素的个数
arr3.length = 0;

console.log(arr3[0]);//undefined

2、 获取数组元素

// 格式:数组名[下标]   下标又称索引
// 下标从0开始
// 功能:获取数组对应下标的那个值,如果下标不存在,则返回undefined。
var arr = ['red', 'green', 'blue'];
arr[0]; // red
arr[2]; // blue
arr[3]; // 这个数组的最大下标为2,因此返回undefined

3、 遍历数组

遍历:遍及所有,对数组的每一个元素都访问一次就叫遍历。

for循环数组遍历的基本语法:

for(var i = 0; i < arr.length; i++) {
    // 数组遍历的固定结构
}

for循环示例:

var arr1 = [1, 3, 4]; 

for(var i = 0; i < arr1.length; i++){
    console.log(arr1[i]);
}

while循环示例:

var arr1 = [1, 3, 4]; 

var i = 0;
while(i < arr1.length){
    console.log(arr1[i]);
    i++;
}

4、 为数组添加元素

// 格式:数组名[下标/索引] = 值;
// 如果下标有对应的值,会把原来的值覆盖,如果下标不存在,会给数组新增一个元素。
var arr = ["red", "green", "blue"];
// 把red替换成了yellow
arr[0] = "yellow";
// 给数组新增加了一个pink的值
arr[3] = "pink";

5、 数组操作案例

案例1:求数组中的所有数的和

//求和
var arr = [10, 20, 30, 40, 50];
//定义变量存储和
var sum = 0;
for (var i = 0; i < arr.length; i++) {
    sum += arr[i];
}
console.log("和为:" + sum);

案例2:获取数组中的最大值

//最大值
var arr = [10, 20, 30, 40, 50, 60];
//假设这个变量中的值是最大的
var maxNum = arr[0];
//遍历数组
for (var i = 0; i < arr.length; i++) {
    //判断
    if (maxNum < arr[i]) {
        maxNum = arr[i];
    }
}
console.log("最大值是:" + maxNum);

案例3: 遍历出数组中所有的偶数

// 遍历出数组中所有的偶数
var arr = [1, 2, 3, 4, 5, 6, 7];
for(var i = 0; i < arr.length; i++){
    //判断
    if(arr[i] % 2 == 0){
        console.log(arr[i]);
    }
}

案例4:将数组转为字符串并以 | 分割

//把数组中的每个名字后面拼接一个|然后以字符串的方式输出
var names = ["卡卡西", "佐助", "凤姐", "鸣人", "黑崎一护"];
var str = "";//空的字符串,用来存储最后的拼接的结果的字符串
//不停的遍历数组的数据,并且拼接字符串
for (var i = 0; i < names.length - 1; i++) {
    str += names[i] + "|";//拼接字符串的方式
}
str += names[names.length - 1];
console.log(str);

六、 函数

把一段相对独立的具有特定功能的代码块封装起来,形成一个独立实体,就是函数,起个名字(函数名),在后续开发中可以反复调用

函数的作用就是封装一段代码,将来可以重复使用

1、 函数的声明及调用

(1) 声明

  • 关键字声明
function 函数名(){
  // 函数体
}
  • 表达式声明
var fn = function() {
  // 函数体
}
  • 特点:

    函数声明的时候,函数体并不会执行,只要当函数被调用的时候才会执行。
    一个函数一般都特定的用来干 一件 事情

(2) 调用

  • 调用函数的语法:
函数名();
  • 特点:

    函数体只有在调用的时候才会执行,调用需要()进行调用。
    可以调用多次(重复使用)

// 声明函数
function sayHi() {
  console.log("吃了没?");
}
// 调用函数
sayHi();

// 求1-100之间所有数的和
function getSum() {
  var sum = 0;
  for (var  i = 0; i < 100; i++) {
    sum += i;
  }
  console.log(sum);
}
// 一段代码可以多次调用
getSum();
getSum();
getSum();

2、 参数

  • 为什么要有参数
function getSum() {
  var sum = 0;
  for (var i = 1; i <= 100; i++) {
    sum += i;
  }
  console.log();
}

// 虽然上面代码可以重复调用,但是只能计算1-100之间的值
// 如果想要计算n-m之间所有数的和,应该怎么办呢?
  • 语法:
// 函数内部是一个封闭的环境,可以通过参数的方式,把外部的值传递给函数内部
// 带参数的函数声明
function 函数名(形参1, 形参2, 形参...){
  // 函数体
}

// 带参数的函数调用
函数名(实参1, 实参2, 实参3);
  • *形参和实参 **
  1. 形式参数:在声明一个函数的时候,为了函数的功能更加灵活,有些值是固定不了的,对于这些固定不了的值。我们可以给函数设置参数。这个参数没有具体的值,仅仅起到一个占位置的作用,我们通常称之为形式参数,也叫形参。
  2. 实际参数:如果函数在声明时,设置了形参,那么在函数调用的时候就需要传入对应的参数,我们把传入的参数叫做实际参数,也叫实参。
function fn(a, b) {
  console.log(a + b);
}
var x = 5, y = 6;
fn(x, y); 
// x,y实参,有具体的值。
// 函数执行的时候会把x,y复制一份给函数内部的a和b,
// 函数内部的值是复制的新值,无法修改外部的x,y

JS 函数在调用时,允许传多个实参,就是实参个数可以比形参个数多;

3、 函数的返回值

当函数执行完的时候,并不是所有时候都要把结果打印。我们期望函数给我一些反馈(比如计算的结果返回进行后续的运算),这个时候可以让函数返回一些东西。也就是返回值。函数通过return返回一个值

返回值语法:

//声明一个带返回值的函数
function 函数名(形参1, 形参2, 形参...){
  //函数体
  return 返回值;
}

//可以通过变量来接收这个返回值
var 变量 = 函数名(实参1, 实参2, 实参3);

*返回值解释: **
如果函数没有显示的使用 return语句 ,那么函数有默认的返回值:undefined
如果函数使用 return语句,那么跟再return后面的值,就成了函数的返回值
如果函数使用 return语句,但是return后面没有任何值,那么函数的返回值也是:undefined
函数使用return语句后,这个函数会在执行完 return 语句之后停止并立即退出,也就是说return后面的所有其他代码都不会再执行。

4、 函数相关的其它事情

(1) 匿名函数与自调用函数

匿名函数:没有名字的函数

匿名函数如何使用:

将匿名函数赋值给一个变量,这样就可以通过变量进行调用

匿名函数如果没有任何变量来表示它,那么就不能直接调用来执行,因此可以通过匿名函数的自调用的方式来执行

(function () {
  alert(123);
})();

关于自执行函数(匿名函数自调用)的作用:防止全局变量污染。

(2) 函数本身也是值 *

function fn() {}
console.log(typeof fn);
  • 函数作为参数

因为函数也是一种值类型,可以把函数作为另一个函数的参数,在另一个函数中调用

function f1(f){
    f();
}
function f2(){
    console.log(2);
}
f1(f2); //2
  • 函数做为返回值

因为函数是一种类型,所以可以把函数可以作为返回值从函数内部返回,这种用法在后面很常见。

function fn(b) {
  var a = 10;
  return function () {
    alert(a + b);
  }
}
var f = fn(5);
f();  //15

七、作用域与JS代码的运行 *

作用域:变量可以起作用的范围和区域

1、 全局变量和局部变量 *

  • 全局变量与全局作用域

    在任何地方都可以访问到的变量就是全局变量,全局变量所在的区域就是全局作用域

  • 局部变量

    只在固定的代码片段内可访问到的变量,最常见的例如函数内部的变量,就是局部变量。局部变量所在的区域就是局部作用域(函数作用域)

不使用var声明的变量是全局变量,不推荐使用。
变量退出作用域之后会销毁,全局变量关闭网页或浏览器才会销毁

2、 变量提升

console.log(a); // undefined
var a = 2;
console.log(a); //   a is not defined
  • 变量提升

    定义变量的时候,变量的声明会被提升到作用域的最上面,变量的赋值不会提升。

  • 函数提升

    JavaScript解析器首先会把当前作用域的函数声明提前到整个作用域的最前面

f();
function f(){
    console.log(12); //12
}
var f = 1;
function f(){
    console.log(12); //12
}
// 由于函数提升在前,所以被变量声明替换了;
// 执行阶段,变量被复制为1,不再是一个函数,
f(); // f is not a function

注:不管是普通变量还是函数,尽量不要出现重名;

3、 JS代码的运行 *

console.log(s); //undefined
var s = 2;

JavaScript代码的执行是由浏览器中的JavaScript解析器来执行的。

JavaScript解析器执行JavaScript代码的时候,分为两个过程:预解析(编译)过程和代码执行过程

预解析过程:

  1. 语法检查,如果有错误,直接停止后续步骤不再运行。
  2. 把变量和函数的声明提升到当前作用域的最前面,只会提升声明,不会提升赋值和调用。
  3. 先提升函数后提升变量,如果函数和变量同名,则被替换;

代码执行过程

变量的赋值,函数的调用,循环判断等,根据代码由上往下顺序执行;

var a = 25;
function abc (){
  alert(a);//undefined
  var a = 10;
}
abc();


// 如果变量和函数同名的话,函数优先做提升
console.log(a);
function a() {
  console.log('aaaaa');
}
var a = 1;
console.log(a);

// 1、----------------
var num = 10;
fun();
function fun() {
    console.log(num); //undefined
    var num = 20;
}

// 2、----------------
var a = 18;
f1();
function f1() {
    var b = 9;
    console.log(a); //undefined
    console.log(b); // 9
    var a = '123'; 
}

4、 词法作用域

变量的作用域是在定义时决定而不是执行时决定的,也就是说词法作用域取决于编译阶段,通过静态分析就能确定,因此词法作用域也叫做静态作用域。

在 js 中词法作用域规则:

  • 函数允许访问函数外的数据.
  • 整个代码结构中只有函数可以限定作用域.
  • 作用域规则首先使用提升规则分析
  • 如果当前作用规则中有名字了, 就不考虑外面的名字
var num = 123;
function foo() {
  console.log( num );
}
foo();

if ( false ) {
    var num = 123;
}
console.log( num ); // undefiend

也就是说:

函数内部可以访问函数外部的变量,但是函数外部不可以访问函数内部的变量;

函数内部如果有变量,则优先使用内部的变量,如果函数内部没有,才会使用函数外部的变量;

8.5 作用域链 *

只有函数可以制造作用域结构, 那么只要是代码,就至少有一个作用域, 即全局作用域。凡是代码中有函数,那么这个函数就构成另一个作用域。如果函数中还有函数,那么在这个作用域中就又可以诞生一个作用域。

将这样的所有的作用域列出来,可以有一个结构: 函数内指向函数外的链式结构。就称作作用域链。
var a = 1;
function fn1(){
    function fn2(){
        function fn3(){
            console.log(a);
        }
        fn3();
    }
    fn2();
}
fn1();
var a = 1;
function fn1(){
    var a = 2;
    function fn2(){
        var a = 3;
        function fn3(){
            console.log(a);
        }
        fn3();
    }
    fn2();
}
fn1();

九、 对象(Object)

1、 什么是对象

万物皆对象

现实生活中:万物皆对象,对象是一个具体的事物,一个具体的事物就会有行为和特征。
举例: 一部车,一个手机
车是一类事物,门口停的那辆车才是对象
    特征:红色、四个轮子
    行为:驾驶、刹车

2、 JavaScript中的对象

JavaScript中的对象其实就是生活中对象的一个抽象
JavaScript的对象是无序属性的集合。
其属性可以包含基本值、对象、数组或函数。
对象就是一组没有顺序的值。
我们可以把JavaScript中的对象想象成键值对,其中值可以是数据和函数。
对象的行为和特征
    特征---属性
    行为---方法

事物的特征在对象中用属性来表示。

事物的行为在对象中用方法来表示。

3、 如何得到一个对象

  • 字面量方式创建对象

    var obj1 = {};//得到一个空对象
    var obj2 = {name:'张三', age:18};//得到拥有两个属性的对象
    //得到拥有两个属性和一个方法的对象
    var obj3 = {
        name:'张三',
        age:18,
        fei:function(){
            console.log('你上天啊!');
        }
    }
    
  • new Object() 创建对象 (内置构造函数)

    var person = new Object();
    
    person.name = 'lisi';
    person.age = 35;
    person.sayHi = function(){
        console.log('Hello,everyBody');
    }
    
  • 自定义构造函数创建对象

    function Person(name, age, job){
          this.name = name;
          this.age = age;
          this.job = job;
          this.sayHi = function(){
            console.log('Hello,everyBody');
          }
    }
    var p1 = new Person('张三', 22, 'actor');
    

4、this 的指向

JavaScript中的this指向问题,比较复杂,有时候会让人难以捉摸,随着学习的深入,我们会不断接触this,

在学习过程中,我们可以不断总结,最终搞清楚this在何种情况下指向何处……

目前,我们只需要记住以下两点就可以了:

1: 函数如果在某个对象下,this就指向这个对象

2:函数如果被直接调用,this指向window对象

var o1 = {
    name: '山治',
    f: function () {
        console.log(this.name);
    }
}
o1.f(); // 山治
function f(){
    console.log(this);
}
f();
console.log(window);

5、 对象的使用

  • 方法及属性的使用
对象.方法名(); //调用对象的方法
对象.属性;   //获取对象的属性
  • 遍历对象的属性

通过for..in语法可以遍历一个对象

var obj1 = {
    name:'路飞',
    age : 17,
    sex : '男',
}
for(var k in obj1){
    console.log(k);
    console.log(obj1[k]);
}

注意:使用for …in语法,同样可以遍历数组

  • 删除对象的属性
var obj1 = {
    name:'路飞',
    age : 17,
    sex : '男',
}
console.log(obj1.age); //17
delete obj1.age;  //删除对象中指定的属性
console.log(obj1.age); // undefined

十、 标准库对象(内置对象)

JavaScript 提供了很多个内置对象:Math/Array/Number/String/Boolean...

对象只是带有属性方法的特殊数据类型。

我们在学习时其实就是要记住对象的每个属性和方法怎么使用,代表什么含义;

技术问题,遇到分歧,去哪里查找资料:

火狐开发者社区--MDN

微软开发者社区--MSDN

1、 Math对象

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Math

(1) 使用

Math 是一个内置对象, 它具有数学常数和函数的属性和方法。不是一个函数对象。

与其它全局对象不同的是, Math 不是一个构造器. Math 的所有属性和方法都是静态的.

跟数学相关的运算直接使用Math中的成员即可

Math对象的属性(常量)

属性(常量) 描述
Math.E 常量 数学常数 e。这是欧拉数,自然对数的底。
Math.LN2 常量 2 的自然对数。
Math.LN10 常量 10 的自然对数。
Math.LOG2E 常量 以 2 为底 e 的对数。
Math.LOG10E 常量 以 10 为底 e 的对数。
Math.PI 常量 Pi。这是圆的周长与直径的比值。
Math.SQRT1_2 常量 0.5 的平方根,或相当于 1 除以 2 的平方根。
Math.SQRT2 常量 2 的平方根。

Math对象的方法(函数)

方法(函数) 描述
Math.abs 函数 返回数字的绝对值。
Math.acos 函数 返回数字的反余弦值。
Math.acosh 函数 返回数字的双曲反余弦值(或反双曲余弦值)。
Math.asin 函数 返回数字的反正弦值。
Math.asinh 函数 返回数字的反双曲正弦。
Math.atan 函数 返回数字的反正切值。
Math.atan2 函数 将与 X 轴的角度(以弧度为单位)返回到由 y 和 x 坐标表示的点。
Math.atanh 函数 返回数字的反双曲正切。
Math.ceil 函数 返回大于或等于提供的数值表达式的最小整数。
Math.cos 函数 返回数字的余弦值。
Math.cosh 函数 返回数字的双曲余弦。
Math.exp 函数 返回 e(自然对数的底)的乘幂数。
Math.expm1 函数 返回 e(自然对数的底)的乘幂数减去 1 的结果。
Math.floor 函数 返回小于或等于提供的数值表达式的最大整数。
Math.hypot 函数 返回参数平方和的平方根。
Math.imul 函数 返回被视为 32 位带符号整数的两个数字的积。
Math.log 函数 返回数字的自然对数。
Math.log1p 函数 返回 1 加上一个数字的的自然对数。
Math.log10 函数 返回数字以 10 为底的对数。
Math.log2 函数 返回数字以 2 为底的对数。
Math.max 函数 返回提供的两个数值表达式中的较大值。
Math.min 函数 返回提供的两个数字中的较小值。
Math.pow 函数 返回基表达式的指定乘幂数的值。
Math.random 函数 返回介于 0 和 1 之间的伪随机数。
Math.round 函数 返回舍入到最近整数的指定数值表达式。
Math.sign 函数 返回数字符号,它指示数字为正数、负数还是 0。
Math.sin 函数 返回数字的正弦值。
Math.sinh 函数 返回数字的反双曲正弦。
Math.sqrt 函数 返回数字的平方根。
Math.tan 函数 返回数字的正切值。
Math.tanh 函数 返回数字的双曲正切。
Math.trunc 函数 返回数字的整数部分,删除任何小数数字。

(2) 案例

  • 求10-20之间的随机数

    Math.floor(Math.random() * (max - min)) + min; 
    

2、Date对象(构造函数)

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Date

(1) 使用

创建 Date 实例用来处理日期和时间。Date 对象基于1970年1月1日(世界标准时间)起的毫秒数。

// 获取当前时间,UTC世界时间,距1970年1月1日(世界标准时间)起的毫秒数
var now = new Date();
console.log(now.valueOf()); // 获取距1970年1月1日(世界标准时间)起的毫秒数

Date构造函数的参数
1. 毫秒数 1498099000356        new Date(1498099000356)
2. 日期格式字符串  '2015-5-1'   new Date('2015-5-1')
3. 年、月、日……                new Date(2015, 4, 1)   // 月份从0开始
  • 获取日期的毫秒形式
var now = new Date();
// valueOf用于获取对象的原始值
console.log(date.valueOf()) 

// HTML5中提供的方法,有兼容性问题
var now = Date.now();   

// 不支持HTML5的浏览器,可以用下面这种方式
var now = + new Date(); // 调用 Date对象的valueOf() 
  • 日期格式化方法
toString()      // 转换成字符串
valueOf()       // 获取毫秒值
// 下面格式化日期的方法,在不同浏览器可能表现不一致,一般不用
toDateString()
toTimeString()
toLocaleDateString()
toLocaleTimeString()
  • 获取日期指定部分
getTime()     // 返回毫秒数和valueOf()结果一样,valueOf()内部调用的getTime()
getSeconds()  // 返回0-59
getMinutes()  // 返回0-59
getHours()    // 返回0-23
getDay()      // 返回星期几 0周日   6周6
getDate()     // 返回当前月的第几天
getMonth()    // 返回月份,***从0开始***
getFullYear() //返回4位的年份  如 2016

(2) 案例

  • 案例1:写一个函数,格式化日期对象,返回yyyy-MM-dd HH:mm:ss的形式
function formatDate(d) {
  //如果date不是日期对象,返回
  if (!date instanceof Date) {
    return;
  }
  var year = d.getFullYear(),
      month = d.getMonth() + 1, 
      date = d.getDate(), 
      hour = d.getHours(), 
      minute = d.getMinutes(), 
      second = d.getSeconds();
  month = month < 10 ? '0' + month : month;
  date = date < 10 ? '0' + date : date;
  hour = hour < 10 ? '0' + hour : hour;
  minute = minute < 10 ? '0' + minute:minute;
  second = second < 10 ? '0' + second:second;
  return year + '-' + month + '-' + date + ' ' + hour + ':' + minute + ':' + second;
}
  • 计算时间差,返回相差的天/时/分/秒
function getInterval(start, end) {
  var day, hour, minute, second, interval;
  interval = end - start;
  interval /= 1000;
  day = Math.round(interval / 60 /60 / 24);
  hour = Math.round(interval / 60 /60 % 24);
  minute = Math.round(interval / 60 % 60);
  second = Math.round(interval % 60);
  return {
    day: day,
    hour: hour,
    minute: minute,
    second: second
  }
}

Date对象 的方法。

方法 描述
getDate 方法 使用当地时间返回一个月某天的值。
getDay 方法 使用当地时间返回一个星期某天的值。
getFullYear 方法 使用当地时间返回年份值。
getHours 方法 使用当地时间返回小时值。
getMilliseconds 方法 使用当地时间返回毫秒值。
getMinutes 方法 使用当地时间返回分钟值。
getMonth 方法 使用当地时间返回月份值。
getSeconds 方法 使用当地时间返回秒值。
getTime 方法 Date 对象中的时间值返回为自 1970 年 1 月 1 日午夜起经过的毫秒数。
getTimezoneOffset 方法 返回主机的时间与协调通用时间 (UTC) 之间的分钟差值。
getUTCDate 方法 使用 UTC 返回一个月某天的值。
getUTCDay 方法 使用 UTC 返回一个星期某天的值。
getUTCFullYear 方法 使用 UTC 返回年份值。
getUTCHours 方法 使用 UTC 返回小时值。
getUTCMilliseconds 方法 使用 UTC 返回毫秒值。
getUTCMinutes 方法 使用 UTC 返回分钟值。
getUTCMonth 方法 使用 UTC 返回月份值。
getUTCSeconds 方法 使用 UTC 返回秒值。
getVarDate 方法 Date 对象中的 VT_DATE 值返回。
getYear 方法 返回年份值。
hasOwnProperty 方法 返回一个布尔值,该值指示一个对象是否具有指定名称的属性。
isPrototypeOf 方法 返回一个布尔值,该值指示对象是否存在于另一个对象的原型链中。
propertyIsEnumerable 方法 返回一个布尔值,该值指示指定属性是否为对象的一部分以及该属性是否是可枚举的。
setDate 方法 使用当地时间设置一个月中某一日的数值。
setFullYear 方法 使用当地时间设置年份值。
setHours 方法 使用当地时间设置小时值。
setMilliseconds 方法 使用当地时间设置毫秒值。
setMinutes 方法 使用当地时间设置分钟值。
setMonth 方法 使用当地时间设置月份值。
setSeconds 方法 使用当地时间设置秒值。
setTime 方法 设置 Date 对象中的日期和时间值。
setUTCDate 方法 使用 UTC 设置一个月中某一日的数值。
setUTCFullYear 方法 使用 UTC 设置年份值。
setUTCHours 方法 使用 UTC 设置小时值。
setUTCMilliseconds 方法 使用 UTC 设置毫秒值。
setUTCMinutes 方法 使用 UTC 设置分钟值。
setUTCMonth 方法 使用 UTC 设置月份值。
setUTCSeconds 方法 使用 UTC 设置秒值。
setYear 方法 使用当地时间设置年份值。
toDateString 方法 以字符串值的形式返回一个日期。
toGMTString 方法 返回使用格林尼治标准时间 (GMT) 转换为字符串的日期。
toISOString 方法 以字符串值的形式返回采用 ISO 格式的日期。
toJSON 方法 用于在 JSON 序列化之前转换目标类型的数据。
toLocaleDateString 方法 将一个日期以字符串值的形式返回,该字符串应适合于宿主环境的当前区域设置。
toLocaleString 方法 返回使用当前区域设置转换为字符串的对象。
toLocaleTimeString 方法 以字符串值的形式返回一个时间,此字符串值应与宿主环境的当前区域设置相适应。
toString 方法 返回表示对象的字符串。
toTimeString 方法 以字符串值形式返回时间。
toUTCString 方法 返回使用 UTC 转换为字符串的日期。
valueOf 方法 返回指定对象的原始值。

3、 Array对象

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array

(1)数组对象的属性及方法

length属性: 返回数组的成员数量。

var arr = ['a', 'b'];
console.log(arr.length) // 2

数组对象的常用方法举例

  • push方法用于在数组的末端添加一个或多个元素,并返回添加新元素后的数组长度。注意,该方法会改变原数组。

    var a = [];
    a.push(1) // 1
    a.push('a') // 2
    a.push(true, {}) // 4
    console.log(a); //[1, 'a', true, {}]
    
  • pop方法用于删除数组的最后一个元素,并返回该元素。注意,该方法会改变原数组

    var a = ['a', 'b', 'c'];
    a.pop(); // 'c'
    console.log(a);// ['a', 'b']
    
  • slice方法用于提取原数组的一部分,返回一个新数组,原数组不变。

    它的第一个参数为起始位置(从0开始),第二个参数为终止位置(但该位置的元素本身不包括在内)。 如果省略第二个参数,则一直返回到原数组的最后一个成员。

    var a = ['a', 'b', 'c', 'd', 'e'];
    console.log(a.slice(0)) // "a", "b", "c", "d", "e"]
    console.log(a.slice(1)) // ["b", "c", "d", "e"]
    console.log(a.slice(1, 3)); // ["b", "c"]
    
  • 返回数组的字符串表示形式。

    var arr = [1, 2, 3, 4];
    console.log(arr.toString()); //1,2,3,4
    

(2) 方法和属性

Array 对象的属性。

属性 描述
constructor 属性 指定创建数组的函数。
length 属性(数组) 返回一个整数值,此整数比数组中所定义的最高位元素大 1,是实际元素个数。
prototype 属性 返回对数组的原型。

Array 对象的方法。

方法 描述
concat 方法(数组) 返回由两个数组组合而成的新数组。
entries 方法 返回包含数组的键/值对的迭代器。
every 方法 检查定义的回调函数是否为数组中的所有元素返回 true
fill 方法 使用指定值填充数组。
filter 方法 对数组的每个元素调用定义的回调函数,并返回回调函数为其返回 true 的值的数组。
findIndex 方法 返回满足回调函数中指定的测试条件的第一个数组元素的索引值。
forEach 方法 为数组中的每个元素调用定义的回调函数。
hasOwnProperty 方法 返回一个布尔值,该值指示某个对象是否具有指定名称的属性。
indexOf 方法(数组) 返回某个值在数组中的第一个匹配项的索引。
isPrototypeOf 方法 返回一个布尔值,该值指示某个对象是否存在于另一个对象的原型链中。
join 方法 返回由一个数组的所有元素串联而成的 String 对象。
keys 方法 返回包含数组的索引值的迭代器。
lastIndexOf 方法(数组) 返回指定值在数组中的最后一个匹配项的索引。
map 方法 对数组的每个元素调用定义的回调函数并返回包含结果的数组。
pop 方法 从数组中移除最后一个元素并将该元素返回。
propertyIsEnumerable 方法 返回一个布尔值,该值指示指定属性是否为对象的一部分且是否可枚举。
push 方法 将新元素追加到一个数组中,并返回数组的新长度。
reduce 方法 通过对数组中的所有元素调用定义的回调函数来累积单个结果。 回调函数的返回值是累积的结果,并且作为对回调函数的下一个调用中的参数提供。
reduceRight 方法 通过对数组中的所有元素调用定义的回调函数来按降序顺序累积单个结果。 回调函数的返回值是累积的结果,并且作为对回调函数的下一个调用中的参数提供。
reverse 方法 将元素顺序被反转的 Array 对象返回。
shift 方法 从数组中移除第一个元素并将返回该元素。
slice 方法(数组) 返回一个数组中的一部分。
some 方法 检查定义的回调函数是否为数组的任何元素返回 true
sort 方法 返回一个元素已经进行了排序的 Array 对象。
splice 方法 从一个数组中移除元素,如有必要,在所移除元素的位置上插入新元素,并返回所移除的元素。
toLocaleString 方法 返回使用当前区域设置的字符串。
toString 方法 返回数组的字符串表示形式。
unshift 方法 在数组的开头插入新元素。
valueOf 方法 获取对数组的引用。
values 方法 返回包含数组的值的迭代器。

4、 String对象

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String

var s = 'JavaScript';
// length属性返回字符串的长度。
var i = s.length; 
//返回参数在字符串中第一次出现的位置
var i = s.indexOf('b'); 
//从原字符串取出子字符串并返回,不改变原字符串
var i = s.substr(2, 4);
//从下标第二个开始截取4个长度的字符串
//toLowerCase方法用于将一个字符串全部转为小写 
//toUpperCase则是全部转为大写
var i = s.toLowerCase();
var i = s.toUpperCase();

// 用于替换匹配的子字符串,只替换第一个匹配 
var i = s.replace('a', 'b');
console.log(i);

String 对象的属性

属性 描述
constructor 属性 指定用于创建对象的函数。
length 属性(字符串) 返回 String 对象的长度。
prototype 属性 为对象的类返回原型的引用。

String 对象的方法。

方法 描述
anchor 方法 将具有 NAME 特性的 HTML 定位点放置在文本两侧。
big 方法 将 HTML <BIG> 标记放置在文本两侧。
blink 方法 将 HTML <BLINK> 标记放置在文本两侧。
bold 方法 将 HTML <B> 标记放置在文本两侧。
charAt 方法 返回指定索引处的字符。
charCodeAt 方法 返回指定字符的 Unicode 编码。
codePointAt 方法 返回一个 Unicode UTF-16 字符的码位。
concat 方法(字符串) 返回由提供的两个字符串串联而成的字符串。
EndsWith 方法 返回一个布尔值,该值指示字符串或子字符串是否以传入字符串结尾。
includes 方法 返回一个布尔值,该值指示传入字符串是否包含在字符串对象中。
fixed 方法 将 HTML <TT> 标记放置在文本两侧。
fontcolor 方法 将具有 COLOR 特性的 HTML <FONT> 标记放置在文本两侧。
fontsize 方法 将具有 SIZE 特性的 HTML <FONT> 标记放置在文本两侧。
hasOwnProperty 方法 返回一个布尔值,该值指示某个对象是否具有指定名称的属性。
indexOf 方法(字符串) 返回字符串内第一次出现子字符串的字符位置。
isPrototypeOf 方法 返回一个布尔值,该值指示某个对象是否存在于另一个对象的原型链中。
italics 方法 将 HTML <I> 标记放置在文本两侧。
lastIndexOf 方法(字符串) 返回字符串内子字符串的最后一个匹配项。
link 方法 将具有 HREF 特性的 HTML 定位点放置在文本两侧。
localeCompare 方法 返回一个值,该值指示两个字符串在当前区域设置中是否相等。
match 方法 通过使用提供的正则表达式对象来搜索字符串并以数组形式返回结果。
normalize 方法 返回指定字符串的 Unicode 范式。
propertyIsEnumerable 方法 返回一个布尔值,该值指示指定属性是否为对象的一部分且是否可枚举。
repeat 方法 返回一个新的字符串对象,它的值等于重复了指定次数的原始字符串。
replace 方法 使用正则表达式替换字符串中的文本并返回结果。
search 方法 返回正则表达式搜索中第一个子字符串匹配项的位置。
slice 方法(字符串) 返回字符串的片段。
small 方法 将 HTML <SMALL> 标记放置在文本两侧。
split 方法 返回一个字符串拆分为若干子字符串时所产生的字符串数组。
StartsWith 方法 返回一个布尔值,该值指示字符串或子字符串是否以传入字符串开头。
strike 方法 将 HTML <STRIKE> 标记放置在文本两侧。
sub 方法 将 HTML <SUB> 标记放置在文本两侧。
substr 方法 返回一个从指定位置开始且具有指定长度的子字符串。
substring 方法 返回 String 对象中指定位置处的子字符串。
sup 方法 将 HTML <SUP> 标记放置在文本两侧。
toLocaleLowerCase 方法 返回一个字符串,其中所有字母字符都转换为小写形式,并将考虑主机环境的当前区域设置。
toLocaleString 方法 返回使用当前区域设置转换为字符串的对象。
toLocaleUpperCase 方法 返回一个字符串,其中所有字母字符都转换为大写形式,并将考虑主机环境的当前区域设置。
toLowerCase 方法 返回一个字符串,其中所有字母字符都转换为小写形式。
toString 方法 返回字符串。
toUpperCase 方法 返回一个字符串,其中所有字母字符都转换为大写形式。
trim 方法 返回已移除前导空格、尾随空格和行终止符的字符串。
valueOf 方法 返回字符串。

5、 包装对象

对象是 JavaScript 语言最主要的数据类型,三种原始类型的值——数值、字符串、布尔值——在一定条件下,也会自动转为对象,也就是原始类型的“包装对象”。

所谓“包装对象”,就是分别与数值、字符串、布尔值相对应的NumberStringBoolean三个原生对象。这三个原生对象可以把原始类型的值变成(包装成)对象。

var v1 = new Number(123);
var v2 = new String('abc');
var v3 = new Boolean(true);

typeof v1 // "object"
typeof v2 // "object"
typeof v3 // "object"

v1 === 123 // false
v2 === 'abc' // false
v3 === true // false

包装对象的最大目的,首先是使得 JavaScript 的对象涵盖所有的值,其次使得原始类型的值可以方便地调用某些方法。

原始类型的值,可以自动当作对象调用,即调用各种对象的方法和参数。

这时,JavaScript 引擎会自动将原始类型的值转为包装对象实例,在使用后立刻销毁实例。

比如,字符串可以调用length属性,返回字符串的长度。

'abc'.length // 3

上面代码中,abc是一个字符串,本身不是对象,不能调用length属性。

JavaScript 引擎自动将其转为包装对象,在这个对象上调用length属性。

调用结束后,这个临时对象就会被销毁。这就叫原始类型与实例对象的自动转换。

注意:JS的内置对象还有很多,我们只不过是学习了比较常用的几个而已;

在后面的学习中,我们还有讲解使用其他类型的内置对象;

可以查看狐火和微软开发者社区,获取更多知识……

额外:

JS代码规范&编程风格

  • 缩进:

    空格和tab键都可以,尽量保持一致,使用一种;

    两个空格和四个空格都行,尽量保持一致就行,但是使用4个空格的多一些;
    
  • 分号:

    尽量不要忘记,每一行的结束都要加分号

    while 与 for 循环后面不要加分号
    
    if else、switch等分支语句后面不要加分号
    
    关键字声明函数,后面不要加分号
    
    表达式声明函数,函数后面加分号
    
  • 区块:

    两种写法

if(){
    
}

if()
{
    
}

​ 理论上两种都可以,但是尽量使用第一种,因为js会在行尾自动添加分号,有时会出现意外情况;

  • 圆括号

    函数的声明和调用、表达式运算

    1:函数调用时,函数名和括号之间没有空格

    2:函数声明时,函数名和括号之间没有空格

    3:参与表达式运算时,括号的前面和后面,都要加空格

  • 变量的声明

    if (!x) {
        console.log(1);
    }
    
    //等同于 ↓
    var x;
    if (!x) {
        console.log(1);
    }
    

    为了避免此种情况的出现,建议将所有在本作用域下声明的变量都提到最前面声明并赋值;

  • 自增自减运算

    因为 ++ 在前和++ 在后的运算结果不同,所以,尽量使用 += 1 -= 1 替代,

    提高代码的可读性;

  • 赋值 =

    运算符及赋值前后加空格;

变量命名和代码缩进 规范,是一个程序员必备的基本编程素质;

让别人给你调试BUG的第一前提条件就是 缩进要规范

调试工具

代码区

console控制台

断点调试

网络

本地缓存

内存使用

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容

  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,057评论 0 13
  • 概要 64学时 3.5学分 章节安排 电子商务网站概况 HTML5+CSS3 JavaScript Node 电子...
    阿啊阿吖丁阅读 8,620评论 0 3
  • 第一章1,什么叫程序:程序就是计算机按照人类完成事物的步骤和逻辑,通过计算机命令来逐步执行最终实现目标的一种机器语...
    悟名先生阅读 900评论 0 4
  • 《追风筝的人》这本书在书架已放置了几年,对于外国作品,我似乎不爱触及。因为受其他老师影响,开启共读篇章。要求学生读...
    水云闲阅读 536评论 0 0
  • 日头出来点点红 照进妹房米海空。 米海越空越好耍, 只愁命短不愁穷。 第一次在某平台网站上看到这部电影时上映时,被...
    猴子_2e4c阅读 264评论 0 0