【前端】JavaScript基础

1 什么是js

JavaScript是一种运行在浏览器中的解释型的编程语言

1.1 js引用

使用<script></script>标签

<script src="public.js" type="text/javascript"></script> 或直接写js代码

  • head中引用
  • body中引用

1.2 body和head引入的区别

html代码从上而下解析,如果在head中引入JS,影响页面打开的速度,存在风险,所以通常放在html body的最下方,这样页面内容先展示,最后在加载JS。

1.3 注释与变量

单行注释通过 //  多行注释通过 /* */

1 name = 'dsx'; // 默认全局变量 
2 function func() {
3     var name = 'niulaoshi'; // var 局部变量 
4 }

2 字符串

 1 //定义字符串 
 2 var str = '你开心就好!'; 
 3 var name = '大师兄'; 
 4 // 字符串的拼接 
 5 var name_str = name+str;  
 6 //字符串操作 
 7 str = '大师兄' 
 8 str.charAt(0) 根据角标获取字符串中的某一个字符  char字符 
 9 str.substring(1,3) 根据角标获取 字符串子序列 大于等于x小于y 
10 str.length 获取字符串长度 
11 str.concat('牛教授')  拼接字符串 
12 str.indexOf('大师') 获取子序列的位置 
13 str.slice(0,1)  切片 start end start<=取值<end 同python
14 str.toLowerCase()  变更为小写 
15 str.toUpperCase() 变更大写 
16 str.split('师',1) 切片 返回数组 参数2为取分割后数组的前x个元素
17  
18 //数字类型(JavaScript 只有一种数字类型。数字可以带小数点,也可以不带)
19  
20 var age = 18;
21 var score = 89.22; 
22 number = '18'; 
23 // 字符串转,如是小数,则会去掉小数部分
24 var n = parseInt(number); 
25 // 转换成小数 
26 f =parseFloat(number);
27 //布尔类型(true 或 false)
28 var t = true; 
29 var f = false;

3 数组(python中的列表)

 1 // 第一种创建方式 var list = new Array(); 
 2 list[0] = '大师兄'; 
 3 list[1] = '牛教授'; 
 4  
 5 // 第二种创建方式 
 6 var list2 = new Array('大师兄','牛教授'); 
 7  
 8 // 第三种创建方式 
 9 var list3 = ['大师兄','牛教授']; 
10  
11 //数组操作 
12 var list3 = ['大师兄','牛教授'];
13  
14 list3.length //数组的长度 
15  
16 list3.push('dsx') //尾部追啊参数 
17  
18 list3.shift() //头部获取一个元素 并删除该元素 
19  
20 list3.pop() //尾部获取一个元素 并删除该元素 
21  
22 list3.unshift('dsx') //头部插入一个数据 
23  
24 list3.splice(start, deleteCount, value) //插入、删除或替换数组的元素 
25  
26 list3.splice(n,0,val) //指定位置插入元素 
27  
28 list3.splice(n,1,val) //指定位置替换元素 
29  
30 list3.splice(n,1) //指定位置删除元素 
31  
32 list3.slice(1,2) //切片;
33  
34 list3.reverse() //反转 
35  
36 list3.join('-') //将数组根据分割符拼接成字符串 
37  
38 list3.concat(['abc']) //数组与数组拼接 
39  
40 list3.sort() //排序

4 对象类型(Python中的字典)

1 var dict = {name:'dsx',age:18,sex:'男' };
2 var age = dict.age; 
3 var name = dict['name'];
4 delete dict['name'] //删除
5 delete dict.age //删除

5 条件判断

  • javascript当中如果是两个等号,代表不去校验数据类型是否相同.三个等号会判断数据类型
‘1’==1为真,而'1'===1为假
 1 if (条件) {
 2     执行代码块
 3 } else if (条件) {
 4     执行代码块
 5 } else {
 6     执行代码块
 7 };
 8  
 9 if (1 == 1) {
10     console.log()
11 } else if (1 != 1) {
12     console.log()
13 } else if (1 === 1) {
14     console.log()
15 } else if (1 !== 1) {
16     console.log()
17 } else if (1 == 1 && 2 == 2) { //and
18     console.log()
19 } else if (1 == 1 || 2 == 2) { //or
20     console.log()
21 }
22  
23 switch (a) {
24     case 1:
25         console.log(111);
26         break;
27     case 2:
28         console.log(222);
29         break;
30     default:
31         console.log(333)
32 }

6 循环

 1 //第一种循环
 2 //循环的是角标
 3 //字符串:循环角标、数组:循环角标、字典:循环Key
 4 tmp = ['宝马', '奔驰', '尼桑'];
 5 tmp = '宝马奔驰尼桑';
 6 tmp = {'宝马': 'BMW', '奔驰': 'BC'};
 7 for (var i in tmp) {
 8     console.log(tmp[i])
 9 }
10 
11 //第二种循环
12 //不支持字典的循环
13 for (var i = 0; i < 10; i++) {
14     console.log(tmp[i])
15 }
16 
17 //第三种循环
18 while (1 == 1) {
19     console.log(111)
20 }

7 函数定义

 1 //1、普通函数
 2 function 函数名(形参, 形参, 形参) {
 3     执行代码块
 4 }
 5 函数名(形参, 形参, 形参);
 6  
 7 //2、匿名函数 匿名函数没有名字,无法调用时找到,将整个函数当做一个参数传递
 8 setInterval(function () {
 9     console.log(11)
10 }, 5000);
11 
12 //3、自执行函数创建函数并且自动执行
13 当引入多个js文件时,函数名可能会出现重复,这时通过自执行函数,保证每一个js文件都会被解析,从而生成独立的容器,防止调用冲突
14 (function (name) {
15     console.log(name)
16 })('dsx');
 1 //作用域
 2 //1.Python的作用域是以函数作为作用域的,其他语言以代码块({})作为作用域的。
 3 //JavaScript是以函数作为作用域
 4 function tmp() {
 5     var name = 'dsx';
 6     console.log(name)
 7 }
 8 tmp();
 9 console.log(name);
10 
11 /*
12 运行结果:
13 dsx
14 name is not defined
15 */
 1 //2.函数作用域在函数未被调用之前,已经创建
 2 var name = 'nhy';
 3 function a() {
 4     var name='dsx';
 5     function b() {
 6         console.log(name);
 7     }
 8     return b
 9 }
10 var c = a();
11 c();
12 /*
13 运行结果:
14 dsx
15 */

由于函数创建时,作用域已经创建,因此最后的作用域结果入上图。c=b。因此执行b()函数,当然首先查找到本层函数的变量name='dsx' 。

 1 //3.函数的作用域存在作用域链(代码不执行时,先生成作用域链)
 2 //当函数嵌套函数时,每一个函数为一个作用域,多层就叫做作用域链,查找遵循作用域链规则
 3 function outer() {
 4     name = 'nn';
 5     function inner() {
 6         var name = 'ii'
 7         console.log('in', name)
 8     }
 9  
10     console.log('out', name);
11     inner()
12 }
13 outer();
14 /*
15 运行结果:
16 out nn
17 in ii
18 */
19 //函数不调用时,只生成作用域,当调用时遵循作用域链执行,name已被重置为hhh,如下图
20 function outer() {
21     var name = 'nn';
22     function inner() {
23         console.log('in', name)
24     }
25  
26     var name = 'hhh';
27     console.log('out', name);
28     inner()
29 }
30 outer();
31 /*
32 运行结果:
33 out hh
34 in hh
35 */

 1 //4.函数内,局部变量提前声明 JavaScript函数在运行前会找到函数内的所有局部变量执行声明
 2 var name = 'xxx';
 3 function func() {
 4     console.log(name);
 5     var name = 'dsx';
 6 }
 7 func();
 8 /*
 9 运行结果:
10 undefined
11 */

上面的代码同下面↓

1 var name = 'xxx';
2 function func() {
3     var name;//js编译器在执行func函数时,会把它body里面的变量提前到最前面进行声明!
4     console.log(name);
5     var name = 'dsx';
6 }
7 func();

8 面向对象

 1 // 在JavaScript中,方法和类写法类似,区别方式为是否有this,如果有就可以当做是类来用 
 2 // JavaScript的类默认就拥有了Python的构造函数__init__
 3 function Foo(name) {
 4     this.name = name;
 5 }
 6 // 创建对象时JavaScript需要用到new关键字来创建对象 
 7 var obj = new Foo('dsx');
 8 console.log(obj.name);
 9  
10 // 类中定义方法,虽然可以用,但是在多个实例时存在重复实例方法,浪费资源。
11 // 不同对象的say函数是两个不同的函数,虽然函数名称和代码都是相同的。每次创建对象,都会创建一个say的方法。 
12 function Foo1(name) {
13     this.name = name;
14     this.say = function () {
15         console.log(this.name)
16     }
17 }
18 var obj1 = new Foo1('dsx_obj1');
19 obj1.say();
20 // 完善类的定义 
21 function Foo2(name) {
22     this.name = name
23 }
24 // 类的原型,将共用的的方法抽出来,当在实例化后,只创建了一个叫做Foo2的对象,对象内只有name
25 //在调用方法时去现在Foo中找,没有找到,会在去原型中找
26 //是否有该方法。有执行,没有就报错 
27 Foo2.prototype = {
28     say: function () {
29         console.log(this.name)
30     }
31 };
32 var obj2 = new Foo2('dsx_obj2');
33 obj2.say();

9 序列化与反序列化

 1 //序列化
 2 var xiaoming = {
 3     name: '小明',
 4     age: 14,
 5     gender: true,
 6     height: 1.65,
 7     grade: null,
 8     'middle-school': '"W3C" Middle School',
 9     skills: ['JavaScript', 'Java', 'Python', 'Lisp']
10 };
11 var s = JSON.stringify(xiaoming);//列化成JSON格式
12 console.log(s);
13 //反序列化
14 var t = JSON.parse(s)//把JSON格式字符串转换成JavaScript对象
15 console.log(t)
 1 //序列化
 2 //第三个参数:要输出得好看一些,可以加上参数,按缩进输出:
 3 JSON.stringify(xiaoming, null, '  ');
 4 //第二个参数:用于控制如何筛选对象的键值,如果我们只想输出指定的属性,可以传入Array:
 5 JSON.stringify(xiaoming, ['name', 'skills'], '  ');
 6 //还可以传入一个函数,这样对象的每个键值对都会被函数先处理:
 7 function convert(key, value) {
 8     if (typeof value === 'string') {
 9         return value.toUpperCase();
10     }
11     return value;
12 }
13 
14 JSON.stringify(xiaoming, convert, '  ');
15 //如果我们还想要精确控制如何序列化小明,可以给xiaoming定义一个toJSON()的方法,直接返回JSON应该序列化的数据:
16 var xiaoming = {
17     name: '小明',
18     age: 14,
19     gender: true,
20     height: 1.65,
21     grade: null,
22     'middle-school': '"W3C" Middle School',
23     skills: ['JavaScript', 'Java', 'Python', 'Lisp'],
24     toJSON: function () {
25         return { // 只输出name和age,并且改变了key:
26             'Name': this.name,
27             'Age': this.age
28         };
29     }
30 };
31 
32 JSON.stringify(xiaoming); // '{"Name":"小明","Age":14}'

10 URI转义

 

原文地址:https://www.cnblogs.com/momolei/p/9835340.html