首页 > 技术文章 > 前端基础之JS

l-uz 2022-02-11 21:39 原文

JavaScript引入方式

Script标签内写代码

<script>
  // 在这里写你的JS代码
</script>
"""
可以编写js代码的地方
	1.pycharm提供的js文件
	2.直接使用浏览器提供的编程环境
"""
ps:pycharm在使用上述关键字的时候如果出现了报错说明js版本没有选择6
需要我们自定义设置 settings>>>l f>>>js

image

引入额外的JS文件

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

注释(注释是代码之母)

// 这是单行注释

/*
这是多行注释
*/

变量与常量

在JS中声明变量需要使用关键字
	老版本	var(全部都是全局变量)
    新版本 let(可以声明局部变量)
    # 推荐使用let(其实问题不大)

JavaScript的变量名可以使用_,数字,字母,$组成,不能以数字开头。
声明变量使用 var 变量名; 的格式来进行声明

'''
变量名是区分大小写的。

推荐使用驼峰式命名规则。

保留字不能用做变量名。
'''

在JS中声明常量也需要使用关键字
	const  # 声明一个真正意义上的常量
 
如何创建变量
	var name = 'Luz'
    let name = 'Luz'
    
如何创建常量()
	const pi = 3.14
    ES6新增const用来声明常量。一旦声明,其值就不能改变。

image

JavaScript数据类型

python基本数据类型
	int、float、str、list、dict、bool、tuple、set
js基本数据类型
	number、string、boolean、undefined、object()
 
查看数据类型
	python中使用type()
    js中使用typeof

image

数值(Number)

# JavaScript不区分整型和浮点型,就只有一种数字类型。
var a = 12.34;
var b = 20;
var c = 123e5;  // 12300000
var d = 123e-5;  // 0.00123

# 数值类型:包含了整型与浮点型: parseInt、parseFloat
parseInt("123")  // 返回123
parseInt("ABC")  // 返回NaN,NaN属性是代表非数字值的特殊值。该属性用于指示某个值不是数字。
parseFloat("123.456")  // 返回123.456

# NaN:Not A Number
"""NaN属于数值类型 表示的意思是 不是一个数字"""

字符串(String)

# 定义字符类型的方式
	1.单引号
    2.双引号
    3.小波浪号
    	var s1 = `
            he
            ll
            ow
            `
            
# 在js中字符串的拼接推荐使用+号
	var a = "ABC"
	var b = "abc;
	var c = a + b; 
	console.log(c);  // 得到ABCabc
    
# 模板字符串(template string)是增强版的字符串,用反引号(`)标识。它可以当做普通字符串使用,也可以用来定义多行字符串,或者在字符串中嵌入变量。
    # 格式化输出
	var name1 = 'Luz'
    var age = 23
	`my name is ${name1} my age is ${age} `

image

用法补充

常用方法:

方法 说明
.length 返回长度
.trim() 移除空白
.trimLeft() 移除左边的空白
.trimRight() 移除右边的空白
.charAt(n) 返回第n个字符
.concat(value, ...) 拼接
.indexOf(substring, start) 子序列位置
.substring(from, to) 根据索引获取子序列
.slice(start, end) 切片
.toLowerCase() 小写
.toUpperCase() 大写
.split(delimiter, limit) 分割

boolean类型

在python中布尔值类型首字母大写	
	True False
在js中布尔值类型全部小写
	true false
    
""(空字符串)、0、null、undefined、NaN都是false。

null和undefined

# 定义
null: 是所有没有赋值变量的默认值,自动赋值
undefined: 主动释放一个变量引用的对象,表示一个变量不再指向任何对象地址
	
    null表示变量的值是空(null可以手动清空一个变量的值,使得该变量变为object类型,值为null),undefined则表示只声明了变量,但还没有赋值。
    
# 共同点:都是原始类型,保存在栈中变量本地

不同点:

   (1)undefined——表示变量声明过但并未赋过值。

它是所有未赋值变量默认值。

例如:var a;    //a自动被赋值为undefined
   (2)null——表示一个变量将来可能指向一个对象。
一般用于主动释放指向对象的引用。

例如:var emps = ['ss','nn'];
              emps = null;     //释放指向数组的引用

对象类型

在 JS 中,除了原始类型那么其他的都是对象类型了。对象类型和原始类型不同的是,原始类型存储的是值,对象类型存储的是地址(指针)。当你创建了一个对象类型的时候,计算机会在内存中帮我们开辟一个空间来存放值,但是我们需要找到这个空间,这个空间会拥有一个地址(指针)。

const a = []
对于常量a来说,假设内存地址(指针)为#001,那么在地址#001的位置存放了值[],常量a存放了地址(指针)#001,再看以下代码

const a = []
const b = a
b.push(1)
当我们将变量赋值给另外一个变量时,复制的是原本变量的地址(指针),也就是说当前变量b存放的地址(指针)也是#001,当我们进行数据修改的时候,就会修改存放在地址(指针)#001上的值,也就导致了两个变量的值都发生了改变。

接下来我们来看函数参数是对象的情况

function test(person) {
  person.age = 26
  person = {
    name: 'yyy',
    age: 30
  }

  return person
}
const p1 = {
  name: 'yck',
  age: 25
}
const p2 = test(p1)
console.log(p1) // -> {name: 'yck', age: 26}
console.log(p2) // -> {name: 'yyy', age: 30}

'''
首先,函数传参是传递对象指针的副本
到函数内部修改参数的属性这步,我相信大家都知道,当前p1的值也被修改了
所以最后person拥有了一个新的地址(指针),也就和p1没有任何关系了,导致了最终两个变量的值是不相同的。
'''

数组类型

数组对象的作用是:使用单独的变量名来存储一系列的值。类似于Python中的列表。

var a = [123, "ABC"];
console.log(a[1]);  // 输出"ABC"

常用方法:(对应python)

image

forEach()

语法:

forEach(function(currentValue, index, arr), thisValue)

参数:

image

map()

语法:

map(function(currentValue,index,arr), thisValue)

image

image

python写法:

image

运算符

1.比较运算符
	==   弱等于  # 会自动转换数据类型至相同状态
	===  强等于  # 不会自动转换数据类型
    
    1 == “1”  // true  弱等于
	1 === "1"  // false 强等于

//数值类型的1转换成字符串类型的1再进行比较,所以我们以后写JS涉及到比较时尽量用三等号来强制限制类型,防止判断错误
    

2.逻辑运算符
	python中
    	and or not
    js中
    	&& || !
  
3.算术运算符
+ - * / % ++ --
# 这里由于的x++和++x在出现赋值运算式,x++会先赋值再进行自增1运算,而++x会先进行自增运算再赋值!

流程控制

定义

'''if判断'''
python中	
	if 条件:
        条件成立之后执行的代码
    else:
        条件不成立执行的代码
js中
	if(条件){
        条件成立之后执行的代码
    }else{
        条件不成立执行的代码
    }
    
	if(条件1){
        条件1成立之后执行的代码
    }else if(条件2){
        条件2成立之后执行的代码
    }else{
        条件都不成立执行的代码
    }
    
'''switch'''
	var day = new Date().getDay();
    switch (day) {
      case 0:
      console.log("Sunday");
      break;
      case 1:
      console.log("Monday"); 
      break;
    default:
      console.log("...")
    }
    
### switch中的case子句通常都会加break语句,否则程序会继续执行后续case中的语句。

for
"""for循环"""
	for(起始值;循环条件;每次循环后执行的操作){
        for循环体代码
    }
    	for (var i=0;i<10;i++) {
  			console.log(i);
			}
    # 练习:如何使用for循环取出数组内的每个元素
		var l1 = [111,222,333,444,555,666]
         for(let i=0;i<l1.length;i++){
             console.log(l1[i])
         }
            
"""while循环"""
	while(循环条件){
        循环体代码
    }

三元运算符

在python中
	res = '吃饭' if 18 > 10 else '喝水'
在js中
	res = 18 > 10 ? '吃饭':'喝水'

函数

函数的定义

在python中
	def 函数名(参数1,参数2,...):
        '''函数注释'''
        函数体代码
        return 返回值

在js中
	function 函数名(参数1,参数2,...){
        // 函数注释
        函数体代码
        return 返回值
    }
// 普通函数定义
function f1() {
  console.log("Hello world!");
}

// 带参数的函数
function f2(a, b) {
  console.log(arguments);  // 内置的arguments对象
  console.log(arguments.length);
  console.log(a, b);
}

// 带返回值的函数
function sum(a, b){
  return a + b;
}
sum(1, 2);  // 调用函数

// 匿名函数方式
var sum = function(a, b){
  return a + b;
}
sum(1, 2);

// 立即执行函数 书写立即执行的函数,首先先写两个括号()()这样防止书写混乱
(function(a, b){
  return a + b;
})(1, 2);

"""
arguments参数 可以获取传入的所有数据
	也支持return和匿名函数
"""

!!!!补充:
ES6中允许使用“箭头”(=>)定义函数。

var f = v => v;
// 等同于
var f = function(v){
  return v;
}
如果箭头函数不需要参数或需要多个参数,就是用圆括号代表参数部分:
var f = () => 5;
// 等同于
var f = function(){return 5};

var sum = (num1, num2) => num1 + num2;
// 等同于
var sum = function(num1, num2){
  return num1 + num2;  //这里的return只能返回一个值,如果想返回多个值需要自己手动给他们包一个数组或对象中
}

函数中的argument参数

function add(a,b){
  console.log(a+b);
  console.log(arguments.length);
 console.log(arguments[0]);//arguments相当于将出传入的参数全部包含,这里取得就是第一个元素1
}

add(1,2)

输出:
 3 2 1

注意:

函数只能返回一个值,如果要返回多个值,只能将其放在数组或对象中返回。

js中的对象

自定义对象

JavaScript的对象(Object)本质上是键值对的集合(Hash结构),但是只能用字符串作为键。

# 相当于python中的字典类型
	方式1: var d = {'name':'Luz','age':23}
    方式2: var d = Object({'name':'Luz','age':23})

class MyDict(dict): # 继承父类
    def __getattr__(self, item): 
        return self.get(item)
    def __setattr__(self, key, value):
        self[key] = value

res = MyDict(name='Luz',age=23)
print(res.name)
print(res.age)
res.xxx = 123
print(res.xxx)
print(res)  

内置对象

image

# 如果需要使用内置对象 需要关键字 new
在python中
	import date
    date()
在js中
	new date()
    
    
##########################################################
序列化
	python中
    	import json
        json.dumps()  # 序列化
        json.loads()  # 反序列化
    js中
    	JSON.stringify()  # 序列化
        JSON.parse()  # 反序列化
"""
如果当前js中有一个布尔值true需要基于网络发送给python程序并且让python转换成布尔值 如何操作
	1.在js中使用JSON.stringify()序列化成json格式字符串
	2.基于网络发送给python程序(自动编码)
	3.python接收 解码并反序列化
"""
##########################################################

RegExp对象

regexp对象
	方式1:var reg1 = new RegExp("^[a-zA-Z][a-zA-Z0-9]{5,11}");
    方式2:var reg2 = /^[a-zA-Z][a-zA-Z0-9]{5,9}/;
全局匹配
	正则表达式的最后不加g则表示匹配成功就结束 加g表示全局匹配
    # 全局匹配会有一个lastindex属性
    reg2
    /^[a-zA-Z][a-zA-Z0-9]{5,9}$/g
    reg2.test('Luz666')
    true
    reg2.test('Luz666')
    false
    reg2.lastIndex
    0
    reg2.test('Luz666')
    true
    reg2.lastIndex
    6
校验时不传参数默认传的是undefined

image

自定义对象

JavaScript的对象(Object)本质上是键值对的集合(Hash结构),但是只能用字符串作为键。

var a = {"name": "Luz", "age": 23};
console.log(a.name);
console.log(a["age"]);

遍历对象中的内容:

var a = {"name": "Luz", "age": 23};
for (var i in a){
  console.log(i, a[i]);
}

事情并没有那么简单...

创建对象:

var person=new Object();  // 创建一个person对象
person.name="Luz";  // person对象的name属性
person.age=23;  // person对象的age属性

注意:

ES6中提供了Map数据结构。它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当做键。

也就是说,Object结构提供了“字符串--值”的对应,Map结构提供了“值--值”的对应,是一种更完善的Hash结构实现。

var m = new Map();
var o = {p: "Hello World"}

m.set(o, "content"}
m.get(o)  // "content"

m.has(o)  // true
m.delete(o)  // true
m.has(o) // false

Date对象

补充方法
1.toString() 方法
定义和用法:toString() 方法可把 Date 对象转换为字符串,并返回结果。
语法:dateObject.toString()
返回值:dateObject 的字符串表示,使用本地时间表示。
输出:Tue Apr 28 2015 10:05:35 GMT+0800 (中国标准时间)

2.toUTCString() 方法
定义和用法:toUTCString() 方法可根据世界时 (UTC) 把 Date 对象转换为字符串,并返回结果。
语法:dateObject.toUTCString()
返回值:dateObject 的字符串表示,用世界时表示。
输出:Tue, 28 Apr 2015 02:06:45 GMT

3.toLocaleString() 方法
定义和用法:toLocaleString() 方法可根据本地时间把 Date 对象转换为字符串,并返回结果。
语法:dateObject.toLocaleString()
返回值:dateObject 的字符串表示,以本地时间区表示,并根据本地规则格式化。
输出:2015/4/28 上午10:07:15

4.toDateString() 方法
定义和用法:toDateString() 方法可把 Date 对象的日期部分转换为字符串,并返回结果。
语法:dateObject.toDateString()
返回值:dateObject 的日期部分的字符串表示,由实现决定,使用本地时间表示。
输出:Tue Apr 28 2015

5.toTimeString() 方法
定义和用法:toTimeString() 方法可把 Date 对象的时间部分转换为字符串,并返回结果。
语法:dateObject.toTimeString()
返回值:dateObject 的时间部分的字符串表示,由实现决定,使用本地时间表示。
输出:10:05:58 GMT+0800 (中国标准时间)

6.toLocaleTimeString() 方法
定义和用法:toLocaleTimeString() 方法可根据本地时间把 Date 对象的时间部分转换为字符串,并返回结果。
语法:dateObject.toLocaleTimeString()
返回值:dateObject 的时间部分的字符串表示,以本地时间区表示,并根据本地规则格式化。
输出:上午10:07:35

7.toLocaleDateString() 方法
定义和用法:toLocaleDateString() 方法可根据本地时间把 Date 对象的日期部分转换为字符串,并返回结果。
语法:dateObject.toLocaleDateString()
返回值:dateObject 的日期部分的字符串表示,以本地时间区表示,并根据本地规则格式化。
输出:2015/4/28
//方法1:不指定参数
var d1 = new Date();
console.log(d1.toLocaleString());
 结果: 2022/2/11 21:15:12
        
//方法2:参数为日期字符串
var d2 = new Date("2004/3/20 11:12");
console.log(d2.toLocaleString());
 结果: 2004/3/20 11:12:00
        
var d3 = new Date("04/03/20 11:12");
console.log(d3.toLocaleString());
 结果: 2020/4/3 11:12:00
                
//方法3:参数为毫秒数
var d3 = new Date(5000);
console.log(d3.toLocaleString());
console.log(d3.toUTCString());
 结果: 1970/1/1 08:00:05
       Thu, 01 Jan 1970 00:00:05 GMT
        
//方法4:参数为年月日小时分钟秒毫秒
var d4 = new Date(2004,2,20,11,12,0,300);
console.log(d4.toLocaleString());  //毫秒并不直接显示
 结果: 2004/3/20 11:12:00

Json对象

var str1 = '{"name": "Luz", "age": 23}';
var obj1 = {"name": "Luz", "age": 23};
// JSON字符串转换成对象
var obj = JSON.parse(str1); 
// 对象转换成JSON字符串
var str = JSON.stringify(obj1);

image

推荐阅读