JS-01

135 阅读7分钟

Javascript

导入

1.
<script>
    代码
</script>
2.注意script 必须成对出现
<script src="js/pj.js"></script>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
<!--    <script>-->
<!--        alert("hello javascript")-->
<!--    </script>-->
<script src="js/pj.js"></script>
<!-- 不用显示定义为type 默认就是JavaScript -->
<script type="text/javascript"></script>
</head>
<body>

</body>
</html>

变量定义

var 变量名=值;

条件控制

与java一样
大小写严格区分  

输出

console.log("hello") 浏览器的控制台输出
alert("hello") 弹窗

数据类型

number
javascript 不区分小数和整数 均为number类型 infinity表示无穷大

字符串
与java类似

布尔值
true false

逻辑运算
&& 与 || 或  ! 非

比较运算符
= 
== 等于(类型不一样,值一样 会判断为true)
=== 绝对等于 (类型,值 都一样才 true)
坚持不要使用==比较
nan 与所有的数值都不相等 包括自己,用 isNaN()判断

浮点数问题

image-20201018133112048

尽量避免用浮点数进行运算,存在精度问题

解决方案:

image-20201018133457447

nullundefined
空      未定义

数组
Java 的数组必须是同类型的对象,js不需要
var arr=[1,2,3,4,5,"hello",null,true];
new Array(1,12,3,4,4,4,"hello");
为保证可读性尽量使用[]
越界 undefined

对象

对象是{},数组是[],属性之间以 , 隔开最后一个变量不需要 , 
对象的属性与值之间以 : 
var person={
    name:"line",
    age:18,
    money:null,
    tags:["js","java","html","css"]
}

对象取值

image-20201018140457899

严格检查模式

<script>
    "use strict";//必须写在JavaScript的第一行
    
</script>

为什么使用:

严格检查模式可以检查局部变量
预防JavaScript的随意性导致产生的一些问题
<script>
    i=2;/*全局变量 容易出错*/
    var i=2/*局部变量*/
    //es6 中局部变量推荐用let定义 const常量
</script>

字符串

用单引号或双引号括起来

var t="a";
var t2='a';

1.1多行字符串

var msg=`
hello 
world
i
am
coming
`;/*  `` tab 上 esc下 */
image-20201018162138914

1.2 模板字符串

let name="line";
let age=18;
let msgs=`hello ,${name} in ${age} `;

image-20201018162917085

1.3 字符串长度 str.length

1.4 字符串可变性 不可变

image-20201018163403750

数组

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

var arr=[1,2,3,4,5];
  1. 长度
arr.length
给length赋值可以改变数组长度,变小会丢失数据

image-20201018163750618

  1. indexOf ,通过元素获取下标
arr.indexOf(2)
1
  1. slice() 截取array 的一部分,返回一个新数组,类似于String中的substring

  2. push(),pop()

    image-20201018164500723

push():压入数据到尾部
pop():取出尾部的一个数据
  1. unshift ,shift() 头部

    image-20201018164722565

unshift():压入数据到头部
shift();从头部弹出一个数据

  1. 排序
arr.sort();
  1. 元素反转
arr.revers()
  1. 数组拼接
arr.concat()
concat 不会修改原数组,返回的是一个新的数组

image-20201018165236219

  1. 连接符 join
arr.join("str")
打印拼接数组,用特定字符串连接

image-20201018165431448

  1. 多维数组
arr=[[1,1],[2,2],[3,3]]
(3) [Array(2), Array(2), Array(2)]
arr[1]
(2) [2, 2]
arr[1][1]
2

对象

若干个键值对,最后一个不用,

所有的键都是字符串,值是任意对象

var 对象名{
    属性名 : 属性值 ,
    属性名 : 属性值 ,
    属性名 : 属性值 
}
  1. 使用一个不存在的属性,不会报错 undefined
  2. 动态的删减属性
delete person.name
true
person.haha="haha"
"haha"
  1. 判断属性值是否在这个对象中 xx in xxx
'age' in person
true

image-20201018172017077

  1. 判断一个属性是否为对象自身拥有的 hasOwnProperty()
person.hasOwnProperty("属性名")

image-20201018172247476

流程控制

  1. if判断

  2. while

  3. for

  4. forEach

/*需要定义一个function*/
arr.forEach(function(value){
    console.log(value)
})
  1. forin
/*传的是数组下标*/
for (const tKey in arr) {
    console.log(arr[tKey]);
}

  1. for of
for(var x of arr){
    console.log(x);
}//打印数组

Map && set

const map = new Map([["tom", 100], ["jack", 10], ["od", 20]]);//for let x of map遍历

image-20201018190204056

const sets = new Set([3,4,5,6,6,6,6,]);//去重 用for of遍历

image-20201018190455507

函数

定义方式一

//绝对值函数
function abs(x){
    if(x>=0)
        return x;
    else return -x;
}

执行return代表函数结束,返回结果

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

定义方法二

var ab=function(x){
    
}

可以传任意数量参数,参数是否存在是一个问题

可以通过手动抛出异常来判断

arguments

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

reset Es6新特性

获取除了已经定义的参数的所有参数

变量作用域

函数查找变量由内向外查找

从自身到外层函数一层层查找

js执行引擎会自动将变量声明提升,但不会提升变量赋值

因此养成规范将变量声明放在函数头部

全局函数

//全局变量
x=1function f(){
    
}
f();

全局对象 window(所有的全局变量都绑定了window)

var x='xxx';
alert(x);
alert(window.x);
var old=window,alert();
//失效
window.alert=function(){}
//恢复
window.alert=old;

js只有一个全局作用域,变量如果在全局作用域都没找到,报错ReferenceError

规范

var person={};//唯一全局变量空间
person.name='ks';
person.add=function(a,b){
   return a+b;
}

把代码放入自己定义的全局唯一变量

let

function a(){
    for(var i=0;i<100;i++)
        console.log(i)
    console.log(i+1);//问题:出现101
}

Es6 let 解决局部作用域冲突

function a(){
    for(var i=0;i<100;i++)
        console.log(i)
    console.log(i+1);//问题:出现101
}

常量const

ES6 之前定义常量:自己规定全部大写字母命名的变量就是常量,建议不要去修改

ES6之后引入了const

方法

function a(){
    var now=new Date().getFullYear();
    return now-this.birth;
}


var k={
    name:"kk",
    birth:2020,
    age : a
}

调用

k.age()

apply

a.apply(k,[])//(对象,参数列表)

apply 将this指向对象k

Date()

var now =new Date();
undefined
now.getFullYear//年
ƒ getFullYear() { [native code] }
now.getFullYear();//年
2020
now.getMonth()//月0~11
9
now.getDate()//日
19
now.getDay()//星期
1
now.getHours()//时
16
now.getMinutes()//分
41
now.getSeconds()//秒
45
now.getTime()//时间戳
1603096905223
now.toString('1603096905223')
"Mon Oct 19 2020 16:41:45 GMT+0800 (中国标准时间)"

JSON

  • JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)
  • JSON 是轻量级的文本数据交换格式
  • JSON 独立于语言:JSON 使用 Javascript语法来描述数据对象,但是 JSON 仍然独立于语言和平台。JSON 解析器和 JSON 库支持许多不同的编程语言。 目前非常多的动态(PHP,JSP,.NET)编程语言都支持JSON。
var json={
    name: 'kk',
    age:19 ,
    a:function aa(){
        alert('hello')
    }
};
var jsonstr=JSON.stringify(json)
var obj= JSON.parse(jsonstr);


//////////////////////////////////////////
console.log(json)
{name: "kk", age: 19, a: ƒ}
undefined
console.log(jsonstr)
{"name":"kk","age":19}
undefined
console.log(obj)
{name: "kk", age: 19}

json 可以转换数组,对象,基本数据类型,但不转换方法

原型

var json={
    name: 'kk',
    age:19 ,
    a:function aa(){
        alert('hello')
    }
};
var jsonstr=JSON.stringify(json)
var obj= JSON.parse(jsonstr);
var stu={
    name:'stu',
    age:18
}
stu.__proto__=json;
//原型可以随意修改,类似于Java的继承

image-20201019174703268

原型链

由己身向上追溯最终追溯到Object,Object的 _ _proto__是null 表示停止查找 但仍指向自己

image-20201019181023069

继承

class student{
    name;
    //构造函数
    constructor(name) {
        this.name=name;
    }
    h(){
        alert('hello')
    }

}
class newstu extends student{
    constructor(name,age) {
        super();//需要调用父类的构造函数
        this.name=name;
        this.age=age;
    }
    ms(){
        alert(this.name+'has'+this.age);
    }
}

本质还是原型

image-20201019180740505