#JavaScript 01

多查手册https://www.w3school.com.cn/js/js_intro.asp

学习新知识,要学会自己动手去测试这个新知识的使用方法,多自己设计案例

1.概念


JavaScript是一门世界上最流行的脚本语言

2.快速入门

2.1引入JavaScript

创建文件夹那些步骤和CSS一样,就不演示了

内部引入

    <script>
        alert("hello,world!!!!!!!");
    </script>

alert是弹窗

外部引入

<script src="js/qj.js"></script>

注释

和Java一样都是两个斜杠

2.2语法入门

定义变量

和java一样,都是

变量类型 变量名 = 变量值

但是JS里面类型就三种

局部变量:let
全局变量:var
常量:const

条件控制

if(){
}

---

if(){
}else{
}

---

if(){
}else if(){
}

和java一样的
JS严格区分大小写

调试代码

在idea里面没法直接调试JS代码,我们要到浏览器里面去调试


这个Console里面可以输入代码去调试
常用指令

//打印变量
console.log(变量名)


Sources是查看源码用的,可以打断点进行调试

使用方法:打断点之后刷新页面就可以进行调试了


还有一些补充的

网路请求,抓包啥的在这里
查看Cookies

2.3数据类型

数值,文本,视频,音频...都是不同的数据类型

变量名命名规范和Java一样,不能用数字开头

number
JS不区分小数和整数,都用number来表示,不像其他语言又分成什么int float

123
123.123
1.23e3
-99  
NaN  //Not a Number
Infinity //无限大

字符串

"abc"
'abc'

布尔值

true
false

逻辑运算

&& 一假则假
||  一真则真
! 非

比较运算符

=
== 等于(只要值一样就是true)
=== 绝对等于(类型和值都要一样才为true)

补充NaN与所有的数值都不相等,包括自己



可以通过一个方法判断是不是NaN

isNaN()


浮点数问题
尽量避免进行浮点数运算,因为存在精度问题
解决办法:利用高数的极限思想
|A-B|<一个无穷小的数,那么A趋于B
(我都不太记得高数了哈哈哈)

console.log(Math.abs((1/3)-(1 - 2/3)) < 0.0000000001)

Math.abs是绝对值

null和undefined
null 空
undefined 未定义

数组
不需要相同数据类型,因为都用var来表示了

var arr = [1,2,3,"hello",true]

也可以想java那样new一个,但是为了可读性,还是用上面这种

new Array(1,2,3,"hello",true)

这里没有数组下标越界,只会报undefined


对象
对象是大括号,数组是中括号

var person = {
      name:"xiaoHong",
      age: 3,
      tags: [1,2,3,"hello",true]
    }

每个属性之间用逗号隔开,最后一个不用
打印方法


上面都是简单过一遍,下面会详细讲各个数据类型

严格检查模式

'use strict';

用于预防JS的代码的随意性导致的一些问题
这句话必须写在开头


3.数据类型

3.1字符串

1.用' '和'' ''包裹,和Java一样
2.注意转义字符 \

\'
\''
\n
\t
\u4e2d Unicode字符 \u####
\x41 Ascll字符

3.多行字符串编写

var arr = `
    hello
    world
    hell
    `

注意这里不是单引号而是反引号,是按Tab键上面那个键

``

4.模板字符串
Java字符串拼接用+号
JS可以用+号,也可以用

//EL表达式
${}

注意:用el表达式得用反引号的字符串才行,不然是不识别的
实例

let name = "xiaoHong";
let age = 10;
let msg = `Hello, ${name}, you are ${age} years old`

去浏览器里输出一下

console.log(msg)
---
Hello, xiaoHong, you are 10 years old

5.字符串长度

变量名.length

6.字符串可变性

不可变

解释:一旦定义了就不能改变字符串的内容
7.大小写转换

//这里是方法了
变量名.toUpperCase()//大写
变量名.toLowerCase()//小写

注意5.7.里一个是属性,一个是方法

console.log(msg.toUpperCase())
---
VM98:1 HELLO, XIAOHONG, YOU ARE 10 YEARS OLD

下面补充一些方法

8.获取字符下标

变量名.indexOf('字符')

9.截取字符串

//从从下标为1的字符串截取到最后一个字符串
变量名.substring(1)
//含头不含尾,从下标为1的字符串截取到下标为2的字符串
变量名.substring(1,3)

3.2数组

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

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

1.长度

arr.length

注意:给arr.length赋值,数组大小会发生变化填充为undefine类型值


但如果赋值过小,元素会丢失
2.indexOf
和上面字符串一样,通过元素获得下标索引
元素2的下标是1

3.slice()截取数组一部分,返回一个新数组
类似于String中的substring,也是包头不包尾

4.push()和pop(),类似于入栈和出栈

//压入到尾部
arr.push('a', 'b')
---
(8) [1, 2, 3, 4, 5, 6, "a", "b"]
//弹出尾部元素
arr.pop()
---
"b"

5.unshift(),shift()

unshift() 压入到头部
shift() 弹出头部元素

6.排序sort()

var arr = [6,2,3,7,5,1]
arr.sort()
(6) [1, 2, 3, 5, 6, 7]

7.反转reverse()

arr.reverse()
---
(6) [7, 6, 5, 3, 2, 1]

8.追加concat()

arr.concat(9, 2, 0)
(9) [7, 6, 5, 3, 2, 1, 9, 2, 0]
arr
(6) [7, 6, 5, 3, 2, 1]

concat()并没有修改数组,只是会返回一个新数组
9.连接符join
打印拼接数组,使用特定的字符串连接(自己定义)

arr.join('--')
"7--6--5--3--2--1"

10.多维数组
和Java一样,就不演示了
还有很多方法,要用的时候查一下手册就行了

3.3对象

若干个键值对
JS中所有的键(属性名)都是字符串,值(属性值)是任意对象!

var 对象名= {
      属性名: 属性值,
      属性名: 属性值,
      属性名: 属性值
    }

---

var person = {
      name:"xiaoHong",
      age: 3,
      email: "1002568778@qq.com" 
    }

1.对象赋值

person.name = "jojo"
"jojo"
person.name
"jojo"

2.使用一个不存在的对象属性不会报错!

person.hahaha
undefined

3.动态的删减属性,通过delete删除

delete person.name
true
person.name
undefined

4.动态的添加

person.hahaha = "hahaha"
"hahaha"

5.判断属性是否在这个对象中

'属性名' in 对象名
---
'age' in person
true
---
//继承
'toString' in person
true

6.判断一个属性是否是这个对象自身拥有的

对象名.hasOwnProperty()
---
person.hasOwnProperty('age')
true
---
//报错
person.hasOwnProperty(age)
VM468:1 Uncaught ReferenceError: age is not defined
    at <anonymous>:1:23

报错原因:键(属性名)都是字符串,一定要用引号括起来,单双引号都可以

3.4流程控制

if判断
和java一样,不写了

while循环
和java一样,不写了
注意避免死循环

for循环
和java一样,不写了
补充:

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

这里尽量用局部变量let来赋值

for...in循环

var age = [12,3,55,1234,45,1235,756];

for (var ageKey in age) {
    console.log(age[ageKey]);
}

for...of循环

for (var ageKey of age) {
    console.log(ageKey);
}

两者效果一样,但是for...of可以用来遍历下面的Map和Set

3.5Map和Set

Map

get方法

//定义几个键值对
var map = new Map([["xiaoMing", 100], ["xiaoHong", 200], ["jojo", 300]]);
//get方法:通过Key获得Value
var name = map.get("xiaoMing");
console.log(name);

set方法

map.set("teacher", 1111111111);
---
map
Map(4) {"xiaoMing" => 100, "xiaoHong" => 200, "jojo" => 300, "teacher" => 1111111111}

delete方法

map.delete("xiaoMing");
---
map
Map(3) {"xiaoHong" => 200, "jojo" => 300, "teacher" => 1111111111}

Set:无序不重复的集合

var set = new Set([3,1,2,3,4,1,3]);
---
set
Set(4) {3, 1, 2, 4}

重复出现的不会打印
添加

set.add(9);

删除

set.delete(1);

是否包含某个元素

console.log(set.has(3));

4.函数

4.1定义函数

方式1:(推荐)

function abs(x){
  if(x >= 0){
    return x;
  }else {
    return -x;
  }
}

方式2:

var abs = function(x){
  if(x >= 0){
    return x;
  }else {
    return -x;
  }
}

方式2是匿名函数,但是可以把结果赋值给abs,通过abs来调用函数
补充:JS函数可以传任意个参数,也可以不传递参数,但是不会报错。

但是可以手动抛出异常
例子1:不传参数

function abs(x){
//typeof获取类型
  if(typeof x !== 'number'){
    throw 'Not a Number';
  }
  if(x >= 0){
    return x;
  }else {
    return -x;
  }
}
不传参数

例子2:传多个参数

arguments-->JS的一个关键字

代表所有传递进来的参数是一个数组,可以通过arguments获得传进来的所有参数


function abs(x){
  console.log("x=>" + x);
  for (let i = 0; i < arguments.length; i++) {
    console.log(arguments[i]);
  }
  
  if(x >= 0){
    return x;
  }else {
    return -x;
  }
}

4.2变量的作用域

JS定义的变量是有作用域的

1.假设在函数体中声明,在函数体外则不可使用
(通过闭包可以实现,后面再讲)

'use strict';
function test(){
    var x = 1;
    x = x + 1;
}
x = x + 2;

2.两个函数使用了相同的变量名,只要都在各自的函数内部,就不会冲突,和Java一样

3.内部函数可以访问外部函数的成员,反之不行
(类似Java的内部类,内部类可以访问外部类的属性,外部类无法访问内部类的属性)

function test1(){
    var x = 1;
    function test2(){
        var y = x + 1;
    }
}
两个都输出不了

4.内部函数和外部函数的变量重名了

function test1(){
    var x = 1;
    function test2(){
        var x = 2;
        console.log('inner' + x);
    }
    console.log('outer' + x);
    test2();
}

test1();


JS函数查找变量从自身的函数开始,由内向外查找,假设外部存在这个同名的函数变量,则内部函数会屏蔽外部函数的变量。
执行路线图
好久没看Java都有点忘了

如果test2放开头的话就是这样

5.提升变量的作用域

function test3(){
    var x = 'x' + y;
    console.log(x);
    var y = 'y';
}
执行结果

上面代码等效于

function test3(){
    var y;
    var x = 'x' + y;
    console.log(x);
    y = 'y';
}

说明:JS执行引擎,自动提升了y的声明,但不会提升变量y的赋值
规范:所有都变量定义都放在函数的头部,不要乱放
(有点像C语言,之前用devc写C语言的时候就要全部在函数头部定义)

function test4(){
var x = 1;
    y = x + 1;
    z,i,a;
}

先定义好了,之后随便用

6.全局函数
全局变量
就是定义在函数外面,那就哪里都可以用
全局对象window
默认所有的全局变量,都会自动绑定在window对象里

var x = 'xxx';
alert(x);
alert(window.x);

alert()这个函数本身也是一个window的变量(函数也可以视为变量)

规范:由于所有的全局变量,都会自动绑定在window对象上,如果不同的JS文件使用了相同的全局变量名,就会发生冲突,所以我们要自己定义一个全局唯一变量

//自定义唯一全局变量(对象)
var nomadApp = {}


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

把自己的代码全部放入自己定义的唯一空间名字中,降低全局命名冲突的问题

7.局部作用域let

function test5(){
    for (var i = 0; i <10; i++) {
        console.log(i);
    }
    console.log(i + '还可以执行!');
}
执行结果

明明出了作用域还能再用,这不符合规则,所以我们要用let关键字

function test5(){
    for (let i = 0; i <10; i++) {
        console.log(i);
    }
    console.log(i + '还可以执行!');
}

执行不了

建议使用let去定义局部变量(比如在for循环里)

8.常量const

之前定义常量:都是用var关键字,变量名全部大写就是常量,你别改

现在定义:const

const PI = '3.14159';

4.3方法

用typora做笔记了,可能不用简书咯

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容