JavaScript的基本知识

272 阅读21分钟

JavaScript简介

1.什么是JavaScript?

JavaScript是运⾏在浏览器上的脚本语⾔。简称JS。

JavaScript是王景公司(NetScape)的 布兰登·艾奇 开发的,最初叫做LiveScript。LiveScript的出现让浏览器更加⽣动,使得页⾯更具有交互性。

JavaScript(简称“JS”) 是⼀种具有函数优先的轻量级,解释型或即时编译型的编程语⾔。虽然它是作为开发Web页⾯的脚本语⾔⽽出名的,但是它也被⽤到了很多⾮浏览器环境中,JavaScript 基于原型编程、多范式的动态脚本语⾔,并且⽀持⾯向对象、命令式和声明式(如 函数式编程)风格。

JavaScript在1995年由Netscape公司的Brendan Eich,在⽹景导航者浏览器上⾸次设计实现⽽成。因为Netscape与Sun合作,Netscape管理层希望它外观看起来像Java,因此取名为JavaScript。但实际上它的语法风格与Self及Scheme较为接近。

JavaScript和java没有任何关系,只是语法类似。JavaScript运⾏在浏览器中,代码由浏览器解释后执⾏。⽽Java运⾏在JVM中。

JavaScript的“⽬标程序”以普通⽂本形式保存,这种语⾔都叫做"脚本语⾔“。

Java的⽬标程序已.class形式存在,不能使⽤⽂本编辑器打开,不是脚本语⾔。

1998年⽹景公司由“美国在线”公司收购。王景公司最著名的就是“领航者浏览器”:Navigator浏览器。

LiveScript的出现,最初的时候是为Navigator浏览器量⾝定制⼀门语⾔,不⽀持其他浏览器。

微软⼀看不⾏,研发了只⽀持IE浏览器的脚本语⾔。JScript。

在两者语⾔共存的时代,程序员需要写两套程序。这时⼀个叫做ECMA组织(欧洲计算机协会)根据JavaScript制定了ECMA-262标准,叫做ECMA-Script.

JavaScript是⼀种属于⽹络的脚本语⾔,已经被⼴泛⽤于Web应⽤开发,常⽤来为⽹页添加各式各样的动态功能,为⽤户提供更流畅美观的浏览效果。通常JavaScript脚本是通过嵌⼊在HTML中来实现⾃⾝的功能的。

2.区分JSP和JS

JSP:JavaServer Pages(⾪属Java)

JS: JavaScrip

HTML中嵌⼊JavaScript

1.HTML嵌⼊JavaScript的第一种⽅式(行内)

在JS中有很多事件,其中⼀个事件叫做:⿏标单击,单词:click。并且任何事件都会对应⼀个事件句柄叫做:onclick。【注意:事件和事件句柄的区别是:事件句柄是在事件单词前添加⼀个on】,⽽事件是以HTML标签的属性存在的。

onclick="js代码“,执⾏原理是什么?

页⾯打开的时候,js代码并不会执⾏,只是把这段代码注册到按钮的click事件上了。等这个按钮发⽣click之后,注册在onclick后⾯的js代码会被浏览器⾃动调⽤。

1.1 行内执行js第一种方式

*js的字符串可以使用单引号,也可以使用双引号。 *JS的⼀条语句结束之后可以使⽤分号“;”,也可以不使⽤。 例如:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>HTML中嵌⼊JavaScript</title>
    <style>
        div {
            width: 500px;
            height: 200px;
            background-color: pink;
        }
    </style>
    
</head>
<body>
    <div onclick="console.log(111)">行内执行js第一种方式</div>
 </body>

页面中这个 div, 鼠标单击一下, 会在控制台打印 111

1.2 行内执行js第二种方式

*怎么使⽤JS代码弹出消息框。

在JS中有⼀个内置对象叫做window,全部⼩写,可以直接拿来使⽤,window代表的是浏览器对象。

*window对象有⼀个函数叫做:alert,⽤法是:window.alert("消息”);这样就可以弹窗了。

*JS的字符串可以使⽤双引号,也可以使⽤单引号。

*JS的⼀条语句结束之后可以使⽤分号“;”,也可以不使⽤。 例如:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>HTML中嵌⼊JavaScript</title> 
</head>
<body>
    <!--点击按钮弹出消息框-->
    <input type="button" value="Hello" onclick="window.alert('Hello JavaScript!')"/>

运行后可以通过点击出现弹窗 Hello JavaScript!

从上可看出,JS是⼀门事件驱动型的编程语⾔,依靠时间去驱动,然后执⾏对应的程序。可以通过script标签,需要运行的js代码可以写在标签里面,但这种方法在js代码多的时候会让编程里的html页面看起来繁杂乱,所以这种方法适合简单的js运行,不适合用于开发过程。

2.HTML嵌⼊JavaScript的第⼆种⽅式(推荐)

引用外部js文件⽅式:

引⼊js脚本⽂件的语句: 同⼀个脚本⽂件可以引⼊多次。

脚本⽂件直接写语句就好了。

<script type="text/javascript" src="路径和⽂件名“></script>

结束的< /script>标签必须有,不能⽤反斜杠取代,引⼊⽂件时,其中间的代码不会执⾏。

JavaScript标识符和变量

1.标识符的命名规则

规则:不遵守会报错

变量名 可以有 字母; 数字; $符号; _下划线 组成 但是!!! 数字不能开头

不能用 JS 的关键字 作为变量名: var if for let

保留字也不行 let

变量名 区分大小

规范:不遵守不会报错, 但是不道德 多个单词连在一起时 推荐使用驼峰命名

2.变量:

声明变量:

var 变量名; 赋值:

变量名=值

javascript是⼀种弱类型语⾔,没有编译阶段,⼀个变量可以随意给其赋值。什么类型的都可以。

变量没有⼿动赋值时,默认赋值为:undefined。

未声明变量使⽤会报错。

2.局部变量和全局变量

全局变量:在函数体之外声明。浏览器关闭的时候才会销毁。

局部变量:在函数体内部声明。在函数体执⾏完后才销毁。

3.当⼀个变量声明的时候没有使⽤var关键字,那么不管这个变量是在哪⾥声明的,都是全局变量

JS的数据类型

1.JS数据类型有:原始类型,应⽤类型。

原始类型:Undefined,Number,String,Boolean,Null

引⽤类型:Object以及⼦类。

1.2.在ES6规范后,⼜基于以上6种类型添加了⼀种新的类型:Symbol。

1.3 JS中有⼀个运算符叫做typeof,这个运算符可以在程序的运⾏阶段动态地获取变量的数据类型。 typeof运算符的语法格式:

typeof 变量名

typeof运算符的运算结果时以下6个字符串(全⼩写)结果之⼀:

“undefined"

“number”

“string”

“boolean”

“object”

“function”

var d=null;

alert(typeof d);//“object”

⽐较字符串时⽤双等号。

1.4.Undefined数据类型只有⼀个值。这个值就是undefined,当⼀个变量没有⼿动赋值,系统默认赋值为undefined,当然也可以⼿动赋值为undefined。

2 number数据类型

如:NaN,表⽰Not a Number不是⼀个数字,但是属于Number类型。

Infinity,表⽰⽆穷⼤。

0,-1,123,…⼩数,复数,⽆穷⼤都是属于number类型。

除数为0时,结果为⽆穷⼤。

函数isNaN(数据):结果为true表⽰不是⼀个数字。

parseInt()函数:可以将字符串⾃动转换成数字。保留Int

parseFloat()函数:将字符串转换成数字。

Math.Ceil()函数:向上取整。2.1会变为3。

3 .boolean数据类型

在boolean类型中有⼀个Boolean()函数,会将⾮boolean类型,转换成boolean类型。

当某个地⽅⼀定是boolean类型时,会⾃动转换成boolean类型。例如if后⾯的括号。

NaN,0,"",null,undefined会⾃动转换成false.

boolean运算包括:!(求反运算)、&&(与运算)、||(或运算

4.String数据类型

1.在JS当中,怎么创建字符串对象

第⼀种:var s=“str”;(⼩String,属于String类型)

第⼆种:var s2= new String(“ab”);(⼤String,属于Object类型)

Sting是⼀个内置的类,可以直接使⽤。

2.⽆论是⼩String还是⼤Sting字符串的长度相同。其中⼜⼀个length属性求长度(x.length)

常⽤函数:s

indexof: 获取指定字符串在当前字符串中第⼀次出现的索引

lastIndexof

replace

substr

substring

toLowerCase

toUpperCase cde spilt 拆分字符串

例如:alert(“abcde".indexof(“cde”));

replace只替换最前⾯⼀个⼦字符串

如果想全部替换需要使⽤正则表达式。

substr和substring的区别。

substr(startIndex length)

substring(startIndex endIndex)左闭右开。

5.Object数据类型

1.Object类型是所有类型的超类,⾃定义的任何类型,默认继承Object。

2.Object的prototype属性

作⽤:给类动态地扩展属性和函数。

3.Object类的函数:

toString()

valueof()

toLocalString()

4.在JS中定义的类默认继承Object的属性和函数。

JavaScript运算

1.基本运算符

基本运算符有+、-、*、%、++、--、=、类似+=的运算符,其使用方式与编程语言(Java、C、C#等)基本一样。

2.Boolean运算(!(求反运算)、&&(与运算)、||(或运算))

变量 && / || 变量

&& 特点: 前一个(符号左边)为真, 返回后一个 前一个为假, 返回前一个

|| 特点: 前一个为真, 返回前一个 前一个为假, 返回后一个

!变量: 取反, 将变量值的布尔值,做一个取反的操作

3. 赋值运算符

每种主要的算术运算以及其他几个运算都有复合赋值运算符: 乘法/赋值(*=)

除法/赋值(/=)

取模/赋值(%=)

加法/赋值(+=)

减法/赋值(-=)

4.关系运算(<、>、<=、>=、==、!= !==)

小于 <

大于 >

小于等于 <=

大于等于 >=

等于 ==

不等于 !=

不全等 !==

5.自增自减运算符

++ 、 --

语法:

1.++变量

2.变量++

4.--变量

5.变量--

作用: 将自身 +1 或者 -1

区别:

符号在前, 先运算自减或自加, 然后参与周围表达式

符号在后, 先参与周围表达式运算, 然后自减或自加

JavaScript语句

1.分支语句

1.1 if...else...语句

if else 特点: else {}只要前边没有 if 判断成功, 那么他一定执行, 如果前边有一个 if 判断成功, 那么他不会执行

1.2 switch

switch 的判断 使用的是全等

语法: switch (判断条件) {

case 条件1:

满足条件1执行的代码

break;

case 条件2: 满足条件2执行的代码

break;

default:

上述条件都不满足时执行的代码 }

穿透现象:

寻找到满足的条件后, 如果没有 break

会继续往下执行, 直到发现 break 或者结束

循环语句

1.for循环

l for循环的使用格式

格式1:

for (变量=开始值;变量<=结束值;变量=变量+步进值)

{  需执行的代码}

格式2:

for (property in expression)

{ 需执行的代码 }

2.while循环

 While循环的使用格式

格式1:

while (expression) { 需执行的代码 }

格式2:

do { 需执行的代码 } while (条件);

3.使用break和continue退出循环

break 命令可以终止循环的运行,然后继续执行循环之后的代码(如果循环之后有代码的话)。continue 命令会终止当前的循环,然后从下一个值继续运行。

JavaScript函数

1.函数的定义与调用

1.1定义函数 function 函数名(var1,var2,...,varX){代码...(return) }

在函数内申明的变量,只能在函数中访问(其生存期就在整个函数中)。在函数外申明的变量,在整个HTML页面内都有效(生存期在整个HTML页面)。

1.2调用函数

函数的定义分两种方式, 调用 只有1种 语法: 函数名()

2.函数的参数

为什么要有 参数?

如果 没有 参数, 那么函数的功能 相对单一, 不够灵活 函数的参数 他的 作用 ---> 能够让函数的功能更加灵活, 更方便在多个地方调用 参数也可以让我们的函数更具有 差异性

参数语法

  1. 形参 ---> function或者函数名后的 小括号

  2. 实参 ---> 函数调用时的 小括号中

参数的作用

  1. 形参 ---》每书写一个形参, 就相当于在函数内部创建一个变量, 形参的值 是由 实参传递进来的

  2. 实参---》 按照书写顺序 一一对应, 传递给形参

函数参数的数量:

参数数量不一致

  1. 形参少, 实参多

  2. 实参少, 形参多

3.使用Function类的length属性

l 使用Function类的valueOf()方法和toString()方法


<html>

<head>

<script type= *"text/javascript"*  language= *"javascript"* >

function fun()

{

document.write("HELLO");

}

</script>

</head>

 

<body>

<script type= *"text/javascript" >

document.write(fun.toString());//输出函数的源代码

</script>

</body>

</html>

这两个方法返回的都是函数的源代码,在调试时尤其有用

### 4.闭包

闭包就是:函数可以使用函数之外定义的变量。

<html>

<head>

<script type= *"text/javascript"*  language= *"javascript"* >

var aNum=100;

function  fun(iNum1, iNum2)

{

   function myFn()

   {

    return    iNum1 + iNum2 + aNum;//使用函数外的变量

   }

  return myFn();

}
</script>

</head>

<body>

<script >

document.write(fun(1,3));

</script>

</body>

</html>

就像使用任何高级函数一样,使用闭包要小心,因为它们可能会变得非常复杂。

JavaScript对象和数组

1.JavaScript对象简介

JvaScript对象也是有属性和方法的

1.1对象属性的使用

<script type= "text/javascript"  language= "javascript" >

var txt="hellow";

document.write(txt.length);//输出3</script>

1.2对象方法的使用

<script type= *"text/javascript"*  language= *"javascript"* >

******var** txt="abcd";

document.write(txt.toUpperCase());//输出ABCD

</script>

2.对象的作用域

1 JavaScript对象只有公用作用域

由于缺少私有作用域,开发者确定了一个规约,说明哪些属性和方法应该被看做私有的。这种规约规定在属性前后加下划线:obj.color = "blue";下划线并不改变属性是公用属性的事实,它只是告诉其他开发者,应该把该属性看作私有的。

2 JavaScript对象没有静态作用域

严格来说,JavaScript并没有静态作用域。不过,它可以给构造函数提供属性和方法。构造函数只是函数,函数也是对象,对象可以有属性和方法。

<script type= *"text/javascript"*  language= *"javascript"* >

******function** sayHello()//构造函数,sayHello是一个类名

{

document.write("hello<br>");

}

sayHello.alternate = **function**()//构造函数的方法成员,可以看成静态方法

{

document.write("hi<br>");

}

sayHello.message="你好";//构造函数的属性,可以看成静态属性

sayHello();//输出 "hello"

sayHello.alternate();//输出 "hi"

document.write(sayHello.message);//输出“你好”

</script>

3 对象的操作

1 对象的操作 (增删改查)

  1. 点语法
  2. 中括号语法(数组语法)

var obj = { name: 'QF' }console.log(obj)

    // // 1. 点语法

    // // 1.1 查   (对象.key)
    // console.log(obj.name)

    // // 1.2 修改 (对象.key = 新值)
    // obj.name = 'QF666'
    // console.log(obj)

    // // 1.3 增加 (对象.新key = 值)
    // obj.age = 18    // 向 对象 obj 中 新增一个 key --> age  对应的值为 18
    // console.log(obj)

    // // 1.4 删除 (delete obj.key)
    // delete obj.name
    // console.log(obj)

    var obj = {
        name: 'QF'
    }
    

2. 中括号语法(数组语法)

    // 2.1 查 (对象['key'])
    console.log(obj['name'])

    // 2.2  修改 (对象['key'] = 新值)
    obj['name'] = 'QF999'
    console.log(obj)

    // 2.3 增加 (对象['新key'] = 值)
    obj['age'] = 18
    console.log(obj)

    // 2.4 删除 delete 对象['key']
    delete obj['name']
    console.log(obj)
    

3遍历对象

遍历对象 就是拿到对象的所有 键值

for...in 循环

    for (var key in obj) {
        // console.log(key)    // 每一轮循环拿到的都是 对象 的 key 

        console.log(key, obj[key])
    }

数组

什么时数组? 存放一些数据的集合就是数组

1 创建数组

1.1 字面量

var arr = [1, 2, 3, 4, 5] console.log(arr) 打印结果为 1 2 3 4 5

1.2 内置构造函数

var arr1 = new Array() console.log(arr1) // 空数组

var arr2 = new Array(5) console.log(arr2)// 创建一个长度为 5 的数组(虽然有长度, 但是实际的值为 空)

var arr3 = new Array(5, 10) console.log(arr3) // 创建一个有内容的数组, 第一个值为 5 第二个值为 10

1.3数组的 length

代表了 数组的 成员数量 ---》 语法: 数组.length

1.4 数组的索引值(下标)

数组的索引就代表了 当前数据 在 数组的 第几个 位置(注意!!! 下标 从 0开始)

var arr = [1, 2, 3, 4, 5] console.log(arr) // 下标 0 1 2 3 4

// 通过 下标获取数组对应的成员 console.log(arr[0]) // 1 获取数组的第一个成员

1.5 遍历数组

拿到数组的每一个成员

var arr = [1, 2, 3, 4, 5] // 下标 0 1 2 3 4

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

2 数组排序法

1.1冒泡排序

原理:

比较相邻的元素。如果第一个比第二个大,就交换他们两个。

对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。

针对所有的元素重复以上的步骤,除了最后一个。

持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比比较

白话就是:比如有6个数,你需要比较5趟,这个是固定死的

但是每一趟比较的次数,是递减的

例如: 已知一个排序好的数组 将数字按照原有顺序插入到数组内 javascript var origin = [10, 20, 30, 40, 50]; var n = 11;

code run here ...

[ 10, 20, 30, 40, 50, 11]

结果: [ 10, 11, 20, 30, 40, 50 ]

解:for (var k = 0; k < arr.length - 1; k++) {

for (var i = 0; i < arr.length - 1 - k; i++) {

console.log(arr[i], arr[i + 1])

if (arr[i] > arr[i + 1]) {

var temp = arr[i]

arr[i] = arr[i + 1]

arr[i + 1] = temp

}

}

}

1.2选择排序

选择排序是一种简单直观的排序算法,无论什么数据进去都是 O(n²) 的时间复杂度。所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间。

1.2.1基本思想

首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。 选择排序的思想其实和冒泡排序有点类似,都是在一次排序后把最小的元素放到最前面,或者将最大值放在最后面。但是过程不同,冒泡排序是通过相邻的比较和交换。而选择排序是通过对整体的选择,每一趟从前往后查找出无序区最小值,将最小值交换至无序区最前面的位置。

1.2.2 算法步骤

首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。

再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。

重复第二步,直到所有元素均排序完毕

3遍历数组的方法

数组的遍历方法 forEach; map; filter; find; findIndex; every; some; reduce;

     *  1. forEach
     *      * 语法: 数组.forEach(function(item, index, origin){})
     *      * 参数: 
     *              1. 数组实际每一项的值
     *              2. 数组每一项对应的下标
     *              3. 原数组
     *      * 作用: 遍历数组
     *      * 返回值:   返回值是 undefined  哪怕你手写了 return 也是 undefined
     * 
     *  2. map
     *      * 语法: 数组.map(function (item, index, origin) {})
     *      * 参数: 
     *              1. 数组每一项实际的值
     *              2. 数组每一项实际的值对应的下标
     *              3. 原数组
     *      * 作用: 映射数组
     *      * 返回值: 返回一个和原数组长度一样的数组, 返回的数组的每一个值, 取决参数的return怎么写
     * 
     *  3. filter; 
     *      * 语法: 数组.filter(function (item, index, origin) {})
     *      * 参数: 
     *              1. 数组每一项实际的值
     *              2. 数组每一项实际的值对应的下标
     *              3. 原数组
     *      * 作用: 过滤数组
     *      * 返回值: 过滤数组后的新数组, 过滤条件取决于 参数的 return 怎么写
     *  4. find; 
     *      * 语法: 数组.find(function (item, index, origin) {})
     *      * 参数: 
     *              1. 数组每一项实际的值
     *              2. 数组每一项实际的值对应的下标
     *              3. 原数组
     *      * 作用: 查找数据
     *      * 返回值: 在数组内找到的第一个数据(不是数组)
     *  5. findIndex;
     *      * 语法: 数组.findIndex(function (item, index, origin) {})
     *      * 参数:
     *              1. 数组每一项实际的值
     *              2. 数组每一项实际的值对应的下标
     *              3. 原数组
     *      * 作用: 查找数据 第一次出现的 下标
     *      * 返回值: 在数组内找到的第一个数据出现的下标
     * 
     *  6. every; 
     *      * 语法: 数组.every(function(item, index, origin){})
     *      * 参数:
     *              1. 数组第一项实际的值
     *              2. 数组第一项实际的值对应的下标
     *              3. 原数组
     *      * 作用: 判断数组内数据是否全都满足条件
     *      * 返回值: 一个布尔值
     *          true ---> 数组内数据全都符合条件
     *          false ---> 数组内起码有一个数据 不符合条件
     *  
     *  7. some;
     *      * 语法: 数组.some(function (item, index, origin) {})
     *      * 参数:
     *              1. 数组每一项实际的值
     *              2. 数组每一项实际的值对应的下标
     *              3. 原数组
     *      * 作用: 判断数组内数据是否  有一项 满足条件的
     *      * 返回值: 一个布尔值
     *          true: 表示数组内至少有一项满足条件
     *          false: 数组内数据全都不满足条件
     * 
     *  8. reduce;
     *      * 语法: 数组.reduce(function (prve, item, index, origin) {}, init)
     *      * reduce方法的参数: 
     *              1. 如果传递第二个参数 init, 执行次数和数组长度相同
     *              2. 如果不传递第二个参数 init, 默认第一值为数组第一项的值, 并且执行次数在数组长度上 减1
     *      * 参数1的函数中4个形参的含义:
     *              1. 表示初始值或者数组第一项的值(具体是什么取决于是否传递 init)
     *              2. 数组每一项实际的值
     *              3. 数组每一项实际的值对应的下标
     *              4. 原数组
     *      * 作用: 累加(叠加)
     *      * 返回值: 循环运行结束后得到的值
     
     例如:
      var arr = [1, 2, 3, 4, 5]
    // 1. forEach
    // var num = arr.forEach(function(item, index, origin) {
    //     // console.log(item, index, origin)
    //     return item
    // })
    // console.log(num)
    // arr.forEach(function(item) {
    //     console.log(item)
    // })

    // 2. map
    // var newArr = arr.map(function (item, index, origin) {
    //     // console.log(item, index, origin)
    //     return item * 2
    // })
    // console.log('newArr ---> ', newArr)

    // 3. filter
    // arr.filter(function (item, index, origin) {
    //     console.log(item, index, origin)
    // })
    // var newArr = arr.filter(function (item, index, origin) {
    //     return item > 3
    // })
    // console.log(newArr)

    // 4. find
    // arr.find(function (item, index, origin) {
    //     console.log(item, index, origin)
    // })
    // var num = arr.find(function (item, index, origin) {
    //     return item > 3
    // })
    // console.log(num)

    // 5. findIndex
    // arr.findIndex(function (item, index, origin) {
    //     console.log(item, index, origin)
    // })
    // var num = arr.findIndex(function (item, index, origin) {
    //     return item > 3
    // })
    // console.log(num)

    // 6. every
    // arr.every(function (item, index, origin) {
    //     console.log(item, index, origin)
    // })
    // var num = arr.every(function (item, index, origin) {
    //     console.log(item, index, origin)
    //     return item > 0
    // })
    // console.log(num)
    
    // 7. some
    // arr.some(function (item, index, origin) {
    //     console.log(item, index, origin)
    // })
    // var num = arr.some(function (item, index, origin) {
    //     return item > 300
    // })
    // console.log(num)

    // 8. reduce
    // arr.reduce(function (prve, item, index, origin) {
    //     console.log(prve, item, index, origin)
    // })
    // var num = arr.reduce(function (prve, item, index, origin) {
    //     console.log(prve)
    //     return prve + item
    // }, 'init--->')
    var num = arr.reduce(function (prve, item, index, origin) {
        return prve * item
    }, 1)
    console.log(num)
    

JavaScript字符串

1 字符串

什么是字符串: 引号包裹的内容就是字符串 单引号; 双引号; 反引号

反引号的字符串也叫做 模板字符串(ES6新)

以前的创建字符串方式 都是 通过 字面量

包装类型: 字符串在正常查询使用的时候, 就是引号包裹起来的内容 但是如果想要使用字符串上的方法, JS 内部会先将字符串包装为一个字符串对象, 这个对象上有一些方法, 使用完毕后, 将字符串对象恢复为普通对象

  1. 字面量

var str1 = "zzz"

var str2 = 'asd'

console.log(str1)

  1. 构造函数

var str4 = new String()

console.log(str4)

var str5 = new String('qwe')

2字符串的length与下标

字符串也是有length与下标的

length 长度

索引(下标): 获取到字符串中指定位置的值 但是! 是只读

var str = 'abcdef'

console.log(str.length)

console.log(str[0])

3字符串的方法

  1. charAt

语法: 字符串.charAt(索引)

作用: 查询指定下标的值

返回值: 查询到的值, 没有查询到就是一个 空字符串

  1. charCodeAt

语法: 字符串.charCodeAt(索引)

作用: 查询指定下标的值 对应的 十进制码

返回值: 查询到的值对应的十进制码, 没有查询到就是 NaN

  1. toLowerCase

语法: 字符串.toLowerCase()

作用: 将字符串转换为小写

返回值: 转换后的字符

  1. toUpperCase

语法: 字符串.toUpperCase()

作用: 将字符串转换为大写

返回值: 转换后的字符

5.ubstr MDN 说明 这个方法将来的某一天可能会删除, MDN 推荐使用 substring 语法: 字符串.substr(开始索引, 多少个) 作用: 截取指定字符串 返回值: 截取到的字符串

  1. substring

语法: 字符串.substring(开始下标, 结束下标) 参数包前不包后

结束下标不传, 相当于写了 length

作用: 截取指定字符串

返回值: 截取到的字符串e

  1. slice

语法: 字符串.slice(开始下标, 结束下标) 参数包前不包后

结束下标不传, 相当于写了 length

开始下标不传, 相当于写了 0

作用: 截取指定字符串

返回值: 截取到的字符串

7.concat

语法: 字符串.concat(数据1, 数据2, 数据3)

作用: 将字符串和 参数传递的数据 拼接

返回值: 拼接后的字符串

8.indexOf

语法: 字符串.indexOf(数据, 开始下标)

作用: 寻找数据在字符串中的位置

返回值: 找到的时候返回下标, 找不到返回 -1

9.lastIndexOf

语法: 字符串.lastIndexOf(数据, 开始下标)

作用: 寻找数据在字符串中出现的位置(倒叙查找)

返回值: 找到返回下标, 找不到返回 -1

10.split

语法: 字符串.split('符号')

参数如果传递的是 空字符串, 会将字符串全部分隔开

作用: 在 字符串中找到分隔符, 将其分割, 并放置到数组中

返回值: 数组形式的

  1. trim

语法: 字符串.trim()

作用: 去掉字符串两侧的空格

返回值: 将去掉空格的字符串返回

12.trimStart ---> trimLeft()

语法: 字符串.trimStart()

作用: 去掉字符串左侧(开始位置)的空格

返回值: 将去掉空格的字符串返回

  1. trimEnd ---> trimRight()

语法: 字符串.trimEnd()

作用: 去掉字符串右侧(结束位置)的空格

返回值: 将去掉空格的字符串返回

  1. includes

语法: 字符串.includes(字符串片段)

作用: 判断 当前字符串中 是否拥有 指定字符串 片段

返回值: true ---> 拥有; false ---> 没有

  1. startsWith

语法: 字符串.startsWith('字符串片段')

作用: 查询字符串开头是不是 指定的 字符串片段

返回值: true: 是开头; false: 不是开头

  1. endsWith

语法: 字符串.endsWith('字符串片段')

作用: 查询字符串结尾是不是 指定的 字符串片段

返回值: true: 是结尾; false: 不是结尾

  1. replace

语法: 字符串.replace('要被替换的字符', '替换的字符')

作用: 找到当前字符串中第一个参数对应的值, 然后将其替换为 第二个参数传入的数据

返回值: 替换完成的字符串

2.反转字符串

1.转化为数组 字符串.split(分隔符)

2.反转数组

3.将数组的每一项合并为一个字符串

var str = 'aabbccdd' var str1 = str.split('')----》 console.log(str1)

var str2 = str1.reverse()----》 console.log(str2)

var str3 = str2.join('')----》 console.log(str3)

通过 代码处理后变成 ---> ddccbbaa

JavaScript数字的方法

1.常用方法

  1. random

语法: Math.random()

作用: 得到一个0~1之间的随机数, 包含0,不包含1

  1. round

语法: Math.round()

作用: 将数据 四舍五入取整

  1. ceil

语法: Math.ceil()

作用: 将数据 向上取整

  1. floor

语法: Matn.floor()

作用: 将数据 向下取整

  1. abs

语法: Math.abs()

作用: 取数据的绝对值

  1. sqrt

语法: Math.sqrt()

作用: 求平方根

  1. pow

语法: Math.pow(基数, 幂)

作用: 求一个基数的 X 次幂

  1. max

语法: Math.max(数据1, 数据2, 数据3, ...)

作用: 求参数中 的 最大值

  1. min

语法: Math.min(数据1, 数据2, 数据3, ...)

作用: 求参数中 的 最小值

  1. PI

语法: Math.PI

作用: 求圆周率

2 计时器

1 计时器 (setInterval)

语法: setInterval(function(){每次执行定时器时要做的事}, 时间) 时间的单位是毫秒

返回值: (时间ID) ---> 值取决于你当前的定时器是这个页面的第几个定时器, 返回值可以用于关闭定时器

关闭定时器: clearInterval(时间ID)

2 倒计时器 (setTimeout)

语法 setTimeout(function () {倒计时时间满足时, 要执行的一段代码}, 时间) 时间的单位是毫秒

返回值: (时间ID) ---> 值取决于你当前的定时器是这个页面的第几个定时器, 返回值可以用于关闭定时器

关闭倒计时器: clearTimeout(时间ID)

关闭定时器: clearInterval 和 clearTimeout

正常来说 两个方法可以混用, 不会出错,

但是根据语义来说 clearTimeout 用于关闭 setTimeout; clearInterval 用于关闭 setInterval