1、javaScript

规范划编写(重要!)

'use strict';

2、数据类型

比较运算符 !重要!

= //赋值
==  //等于(类型不一样,值一样,也会判断为ture)
=== //绝对等于(类型一样,值一样,才会判断为ture)
NaN //not a Number(不为数值类型)
建议不要使用 == 比较

须知:

2.1、字符串

  1. 正常的字符串我们使用 单引号,或者双引号包裹javaScript不区分单引号和双引号
  2. 注意转义字符 \

       \' 表示字符串
       \n 换行
       \t tab
       \u4e2d \u### Unicode字符
       \x41   Ascll字符
    
  3. 多行字符串编写 `` piao(tab键上面,Esc下面)

       var msg =
       `hello
       world
       你好ya
       你号`
    
  4. 模板字符串

       let name = "jiangbiao";
       let age = 3;
       
       let msg = `你好呀,${name}`
    
  5. 字符串长度

       var student = "student"
       student.length
       7
    
  6. 大小写转换

       //注意,这里是方法,不是属性
       var student = "student"
       student.toUpperCase()
       STUDENT
       student.toLowerCase()
       student
    
  7. indexOf()通过元素获得下标索引

       var student = "student"
       student.indexOf("t")
       1
    
  8. substring() 截取字符串

       [)
       var student = "student"
       student.substring(1)//从第一个字符串截取到最后一个字符串
       student.substring(1,3)//[1,3)包含前面 不包含后面
       "tu"
    
  9. 字符串的可变性, 不可变!

image-20201128155728260.png

2.2、数组

Array可以包括任意的数据类型

    var arr = [1,2,3,4,5,6,"a","b"]


1.长度

    arr.length
    8


2.indexOf()通过元素获得下标索引

    arr.indexOf(2)
    1

字符串的 "1" 和数字的 1 是不同的

3.slice() 截取Array的一部分,返回一个新的数组,类似于string中的substring
4.push(),pop() 尾部

    push:压入到尾部
    pop:弹出尾部的一个元素
    arr.push(12)
    9
    arr
    (9) [1, 2, 3, 4, 5, 6, "a", "b", 12]
    arr.pop()
    12

5.unshift() ,shift() 头部

    unshift:压入到头部
    shift:弹出头部的一个元素

6.排序 sort()

    (3) ["B","C","A"]
    arr.sort()
    (3) ["A", "B", "C"]

7.元素反转 reverse()

    (3) ["A", "B", "C"]
    arr.reverse()
    (3) ["C", "B", "A"]

8.concat()拼接

    (3) ["C", "B", "A"]
    arr.concat([1,2,3])
    (6) ["C", "B", "A", 1, 2, 3]
    arr
    (3) ["C", "B", "A"]

注意:concat()不会修改数组,只会返回一个新的数组
9.连接符 join

    arr
    (3) ["C", "B", "A"]
    arr.join('-')
    "C-B-A"

打印拼接数组,使用特定的字符串连接
10.多维数组

    arr = [[1,2],[3,4],["5","6"]]
    (3) [Array(2), Array(2), Array(2)]
    arr[1][1]
    4

2.3对象

若干个键值对

var 对象名 = {
属性名: 属性值,
属性名:属性值,
属性名:属性值
}
//定义了一个person对象,它有是个属性!
var person= {
name:"nanmu",
age: 3,
email: "2363819485@qq.com",
score: 0
}

js中对象,{......}表示一个对象,键值对描述属性xxxx:xxxx多个属性之间使用逗号隔开,最后一个属性不加逗号!(因为有些浏览器不兼容,会报错。版本低)


1、对象赋值

person.name = "biaobin"
"biaobin"
person.name
"biaobin"

2、使用一个不存在的对象属性,不会报错!只会打印undefined (java中会报错)

person.haha
undefined

3、动态的删减属性,通过delete删除对象的属性(java不行)

delete person.name
true
person

4、动态的添加,直接给新属性添加值即可

person.haha = "haha"
"haha"
person

5、判断属性值是否在这个对象中!xxx in xxx!

//javaScript中的所有的键都是字符串,值是任意对象!
'age' in person
true
//继承(父类的方法)
'toString' in person
true

6、判断一个属性是否是这个对象自身拥有的属性
hasOwnProperty()

preson.hasOwnProperty('toSting')
false
preson.hasOwnProperty('age')
true

2.4、流程控制

1、if判断

var age = 3;
if(age>3){
    alert("haha");
}else if(age<5){
    alert("ku");
}else{
    alert("kuya~");
}

2、while循环,避免程序死循环

while(age<100){
      age = age+1;
    console.log(age)
}
do{
      age = age+1;
    console.log(age)
}while(age<100)

3、for循环

for (let i = 0; i < 100; i++) {
    console.log(i)
}

4、forEach数组循环

在js5.1引入
//在javascript函数,在java中是方法
var age = [1212,13,15,2,13,1523,2];
//function 函数
age.forEach(function (value){
    console.log(value)
})

5、for...in
javascript

var age = [1212,13,15,2,13,1523,2];
for (var num in age){
        console.log(age[num]);
}

java

int[] age = {1212, 13, 15, 2, 13, 1523, 2};
        for (int num : age){
            System.out.println(age[num]);
        }

C#

int[] age = { 1212, 13, 15, 2, 13, 1523, 2 };
            foreach (int num in age)
            {
                Console.WriteLine(num);
            }

注意:区别是javascript赋给的是索引(建议不用for-in),java赋给的是值。C#使用的是foreach并无for...in
javascript但用for...of(ES6) 可赋给的是值

var age = [1212,13,15,2,13,1523,2];
for (var num of age){
        console.log(num);
}

2.5Map 和 Set

ES6的新特性~
Map:
var map = new Map([["ton",100],["jack",90],["haha",80]]);
var name = map.get('jack'); // 通过key获取value!
map.set('admin',123456); //新增
map.delete('ton');  //删除
console.log(name);

Set:无序不重复集合

var set = new Set([3,1,1,1,1]);
set.add(2); // 新增
set.delete(1);  // 删除
set.has(3); //是否包含某个元素
set.clear();  //清除全部数据
set.entries() //复制一个相同的值

3.6、iterator

ES6 新特性 for-of
遍历数组
var arr = [1212,13,15,2,13,1523,2];
for (let x of arr){
        console.log(x);
}

遍历map

var map = new Map([["ton",100],["jack",90],["haha",80]]);
for (let x of map){
        console.log(x);
}

遍历set

var set = new Set([3,1,5,6]);
for (let x of set){
        console.log(x);
}

3、函数

3.1、定义函数

定义方式一:绝对值函数
function abs(x){
    if(x>=0){
        return x;
    }else{
        return -x;
    }
}

一旦执行到 return 代表函数结束,返回结果!

如果没有执行 return ,函数执行完也会返回结果,结果就是 Undefined

定义方式二:匿名内部类
var abs = function(x){
    if(x>=0){
        return x;
    }else{
        return -x;
    }
}

function(x){ ...... }这是一个匿名函数,但是可以把结果赋值给abs,通过abs就可以调用函数!
方法一和方法二等价!

函数调用
abs(10); //10
abs(-10); //10

参数问题:javaScript可以传任意个参数,也可以不传参数~

参数进来是否存在的问题?

假设不存在参数,如何规避?

function abs(x){
    //手动抛出异常来判断
    if (typeof x != 'number'){
        throw 'Not a number'
    }
    if(x>=0){
        return x;
    }else{
        return -x;
    }
}
arguments
arguments是一个JS免费赠送的关键字;

arguments:代表,传递进来的所有的参数,是一个数组!

function abs(x){

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

    if(arguments.length>1){  //arguments可以通过判断去取值
        arguments[1]
    }
    
    if(x>=0){
        return x;
    }else{
        return -x;
    }
}

问题:arguments包含所有的参数,我们有时候想使用多余的参数来进行附加操作。需要排除已有参数~

rest
以前:
if (arguments.length>2){
    for (var i=2;i<arguments.length;i++){
        //
    }
}

ES6引用的新特性,获取除了已经定义的参数之外的所有参数~ ....

function aaa(a,b,...rest){
    console.log("a=>"+a);
    console.log("b=>"+b);
    console.log(rest)
}

rest参数只能写在最后面,必须用 ... 标识

3.2、变量的作用域

在javascript中,var定义变量实际是有作用域的。

假设在函数中声明,则在函数体外不可以使用~(非要想实现的话,后面可以研究一下 闭包

function qq (){
    var x = 1;
    x = x + 1;
}
x = x +2;  //Uncaught ReferenceError: x is not defined(报错未定义)

如果两个函数使用了相同的变量名,只要在函数内部,就不冲突

function qq (){
    var x = 1;
    x = x + 1;
    function qq1 (){
       var x = "A";
       x = x + 1;
    }
}

内部函数可以访问外部函数的成员,反之不行

function qq (){
    var x = 1;
    function qq1 (){
        var y = x + 1;
    }
    var z = y + 1;  //Uncaught ReferenceError: x is not defined(报错未定义)
}

假设,内部函数变量与外部函数变量,重名!

function qq (){
    var x = 1;
    qq1();
    function qq1 (){
        var x = 'A';
        console.log("inner"+x);//innerA
    }
    console.log("outer"+x);//outer1
}

javaScript中函数查找变量会从自身函数开始~由“内”向”外“查找 ( 就近原则

假设外部存在这个同名的函数变量,则内部函数会屏蔽外部函数的变量。

提升变量的作用域
function qq (){
    var x = "x"+y;
    console.log(x);
    var y = 'y';
}

这个是javaScript建立之初就存在的特性。所以养成规范:所有的变量定义都要放在函数的头部,不要乱放,便于代码维护;

function qq (){
    var x=1,
        y=x+1,
        z,i,a;//undefined
    
    //之后随意用
}
全局变量
//全局变量
x=1;

function f(){
    console.log(x);
}
f();
console.log(x);

全局对象 window

var x = 'xxx';
alert(x);
alert(window.x); //默认所有的全局变量都会自动绑定在window对象下;

默认所有的全局变量都会自动绑定在window对象下;

alert()函数本身也是一个`window`变量
var x = 'xxx';

alert(window.x);

var old_alert = window.alert;

//old_alert(x);

window.alert = function(){

}
//发现alert();失效了
window.alert(123);

//恢复
window.alert=old_alert;
window.alert(456);

JavaScript实际上只有一个全局作用域,任何变量(函数也可以视为变量),假设没有在函数作用范围内找到,就会向外查找,如果在全局作用域都没有找到,就会报错RefrenceError

规范
由于我们所有的全局变量都会绑定到我们的window上。
如果不同的js文件,使用了相同的全局变量。那么我们如何能够减少冲突
//唯一全局变量
var bloody = {};

//定义全局变量
bloody.name = 'faker';
bloody.add = function(a,b){
    return a + b;
}

那么我们可以把自己的代码全部放入自己定义的唯一空间名称中,降低全局命名冲突的问题~(jQuery就是这样)

局部作用域 let
function aa(){
    for (var i = 0; i < 100; i++) {
        console.log(i)
    }
    console.log(i+1);//问题? 出了for循环这个作用域还可以使用i
}

解决方法:在ES6 引入了let关键词,来解决局部作用域冲突问题!

function aa(){
    for (let i = 0; i < 100; i++) {
        console.log(i)
    }
    console.log(i+1); //Uncaught ReferenceError: i is not defined
}

建议都使用let去定义局部作用域的变量;

常量 const
在ES6之前,怎么定义常量:只有用全部大写字母命名的变量就是常量;(建议不要去修改这些值)
var PI = '3.14';
console.log(PI);
PI=213;   //如果有人不去遵循这个规范,那么这个值是可以去改变的
console.log(PI);

所以在ES6引入了常量关键词const

const PI = '3.14'; //只读变量
console.log(PI);
PI=213;  //Uncaught TypeError: Assignment to constant variable.
console.log(PI);

3.3、方法

javascript存在函数与方法
函数(function)是可以执行的javascript代码块,由javascript程序定义或javascript实现预定义。函数可以带有实际参数或者形式参数,用于指定这个函数执行计算要使用的一个或多个值,而且还可以返回值,以表示计算的结果。

方法(method)是通过对象调用的javascript函数。也就是说,方法也是函数,只是比较特殊的函数。假设有一个函数是fn,一个对象是obj,那么就可以定义一个method

区别
  1. 方法中的数据是隐式传递的,所有传递给函数的数据都是显式传递
  2. 方法可以操作类内部的数据(请记住,对象是类的实例化–类定义了一个数据类型,而对象是该数据类型的一个实例化)

^ 以上只是简略的解释,忽略了作用域之类的问题。 

总结:
  1. 方法和对象相关;
  2. 函数和对象无关。
  3. Java和C#中只有方法,C中只有函数,而C++里取决于是否在类中。

在类型语言中(如:C#,Java)叫方法,在弱类型语言中(如:javascript,vbscript)叫函数,没有严格区分

定义方法
javaScript的方法就是把函数放在对象的里面,对象只有两个东西:属性和方法
var jiang = {
    name:'jiangbiao',
    bitrh: 2000,
    age : function (){
        var now = new Date().getFullYear();
        return now-this.bitrh;
    }
}
//jiang.name  属性
//jiang.age()  方法,一定要带()
//结果:20

this 指针

var jiang = {
    name:'jiangbiao',
    bitrh: 2000,
    age : getAge
}
function getAge(){
    var now = new Date().getFullYear();
    return now-this.bitrh;
}
//jiang.age 成功打印 20
//getAge() NaN

总结: this始终指向调用他的人(this是无法指向的,是默认指向调用它的那个对象java)

apply
applyfunction的上级,在js可以控制this指向!
getAge.apply(jiang,[]); //this, 指向了jiang, 参数为空

最后修改:2021 年 10 月 14 日
如果觉得我的文章对你有用,请随意赞赏