开发工具
常用的浏览器:谷歌、火狐
JS Typora也是用JS 来做的 JS能实现很多功能!
JS是轻量级的脚本语言,也是一种嵌入式语言,对象模型语言。JS的核心就是简单的两部分:
1.基本的js语法结构
2.标准库
JS这个要运行,要依靠宿主环境提供的API,才能实现其他复杂的操作和功能(例如浏览器就是一个最常见的宿主环境),另外还有服务器环境(操作系统)例如js可以运行在windows操作系统中
JS的强大也就体现在它能运用到很多宿主环境中
除了写不了硬件方面的操作,其他JS基本无所不能
JS代码的引入
将js代码写在HTML行内
写在script中
外部引入JS文件——注意这个时候再在script中写js代码,写了不报错但是也不会运行这个里面的js
注意:<script src='路径'></script>
JS的基本语法
变量
变量就是存储数据的容器
var h1=123,h3=345;
JS中的变量是区分大小写的 例如name与Name是两个不同的变量
注意变量的名字:只能由数字、字母、_(下划线)、$组成 且不能以数字开头
数据类型
数值、字符串、布尔、undefined、null、对象
数值和字符串
注意字符串要用英文的单引号或者双引号引起来
var str = '123';
Number 类型:
·数值字面量:数值的固定值的表示 法 1101024 60.5
·浮点数
.。浮点数的精度问题
浮点数
var n = Se-324;//科学计数法 5 乘以 1 0 的 -324 次方
浮点数值的最高精度是 17 位小数,但在进行算术计算时其精确度远远不如整数
var result = 0.1+ 0.2;//结果不是 0.3,
而是 :0.30000000000000004console .log(o.07 * 100);
不要判断两个浮点数是否相等
·数据范围
最小值:Number .MIN-VALuE,//这个值为:5e-3245乘以10的-324次方
最大值:Number.MAX_VALUE,//这个值
为:1.7976931348623157e+308
无穷大:Infinity
无穷小: -Infinity
如果要在字符串中国使用引号 要加转义字符\
var str = '你好,我是'xxx'';
'我喜欢 "黑马"'程序员''
打印空格使用\b
如果想打印出一个\ ==> 就应该输入\\
其他数据类型
-
获取字符串的长度:length 属性用来获取字符串的长度
var str =’黑马程序猿Hello wor ld ' ;console.log(str .length); -
获取变量的类型:
Typeofvar age = 18;console . 1og(typeof age);// ‘ number ' -
字符串拼接:
字符串拼接使用
+连接1.两边只要有个是字符串,那么+就是字符串拼接功能
2.两边如果都是数字,那么就是算术功能。
//+既可以作为数学运算使用也可以作为字符串拼接使用
//从前往后进行运算,如果两个变量都是数值型那么加号作为数学运算符
//直到遇到一个字符串,此后所有的加号都是字符串拼接
例如:12+34+'56'==> '4656'
'12'+34+56==>'123456'
-
Boolean 类型
Boolean字面量:true 和 false,区分大小写
计算机内部存储:true 为 1,false 为 0
-
Undefined 和 Null:
-
undefined 表示一个声明了没有赋值的变量,变量之声明的时候值默认是undefined
-
null 表示一个空**(空对象)**,变量的值如果想为 null,必须手动设置
-
-
复杂数据类型:Object
可以在谷歌浏览器中看到 字符串类型黑色显示,数值类型&布尔==>蓝色,null&未定义==>灰色
其他类型转为字符串类型
其他类型转换成字符串类型的方法有如下几种。
1、toString()
var num = 5;
console.1og(num. toString());
2、String()
s.toString();
String() 函数存在的意义:有些值没有 toString(),
这个时候可以使用 String().比如: undefined 和 null
3、拼接字符串方式
num + "", 当+两边一个操作符是字符串类型,一个操作符是其它类型的时候,会先把其它类型转换成字符串再讲行字符串拼接,返回字符串。
##如何将其他类型转换为数值类型
1、Number()
//var a =" 1";
//var b = Number(a);
var c = Number("a") ==> NAN 表示非数字
var d = Number(null) ==> 0 特殊注意!
var e = Number (underfind);==> NAN
2、parseInt
如果是以数字开头的,那么可以帮你转,后面如果跟了不是数字的,就直接丢掉
var a = parseInt("2");==>2 成功转化
var b = parseInt("23k");==> 23
var b = parseInt("k23");==>NAN
var c = parseInt(null);==>NAN(注意现在已经不能转换)
var d = parseInt(underfind);==>NAN
3、parseFloat
如果是以数字开头的,那么可以帮你转,后面如果跟了不是数字的,就直接丢掉
var a = parseFloat("1.23df");==>1.23
var b = parseFloat("1.3.4.5");==>1.3
var c = parseFloat("h34");NAN
var d = parseFloat(unll);NAN
var d = parseFloat(underfind);NAN
布尔类型转换
var b =Boolean(0);==>false
var b1 =Boolean(2);==>true关于字符串转为布尔型:只要字符串里面有东西 那么都为true 只有个空格也算有东西
var a =Boolean(‘0’);==>true
var c =Boolean(‘2’);==>true
var f =Boolean(' ')==>true
var d =Boolean(null);==>false
var e =Boolean(underfined)==>false
JS操作符与运算符
自增自减(重要):
案例 1:// var n1 = 5;
//++n1; n1变成了6
// var n2= 6;
//console.log(n1+ ++n2); ==>13
//console.log(n1); ==>6
//console.log(n2); ==>7
操作符在变量前面,先进行自身运算,再进行其他运算
案例 2:// var n1 = 5;
//++n1; n1变成了6
// var n2= 6;
//console.log(n1+ n2++); ==>12
//console.log(n1); ==>6
//console.log(n2); ==>7
操作在变量的后面,先进行其他运算,再进行自身运算
案例 3: var a=1;
var b= ++a + a++; ==>(++a)=2; a=2; b=(++a)+a=2+2=4; a=3
console.log(b); 4
console.log(a); 3
案例 4:var a =1;
var b = a++ + ++a; ==>(a++)=1; a=2; (++a)=3; a=3 b=1+3=4
Console.log(b);
Console.log(a);
逻辑运算符的优先级
先运算 && 再运算 ||
var a=1;
var b=2;
var c=0;
console.log(a || c && b) 结果为 1
注意啊!布尔运算的结果不是只能返回1或者0呀
逻辑或运算 a||b,从左边开始,返回第一个转化为布尔值后值为true的 表达式的运算结果,如果全部为false则返回最后一个表达式的运算结果
例如 var f == true && 22;
返回的是22(可以理解为:因为第一个已经是true了,决定在后面那个)
比较运算符
== != (不比较数据类型) var a = '2'; var b = 2; a==b是对的
=== !== 全等比较(比较数据类型)
JS是一种弱类型语言 ==> 变量的数据类型存在自动转换
运算符的优先级
1.()括号优先级最高
2.++ -- !一元运算符(只涉及到一个变量)
3.+ - * / %算数运算符(也是先乘除后加减)
4.关系运算符 > < >= <=
5.相等运算符 == != === !==
6.逻辑运算符 先&&后||
7.赋值运算 =
数组
1.字面量方式构建数组
var arr1=[ ];
var arr2=[1,'d'];
2.构造函数方式创建数组
var arr3 = new Array(1,'d');
- 获取数组长度:arr3.length
数组里面能有数组;数组里又有数组的情况==>多维数组
var a1 = [1,4,'k','1'];
var a2 = [6,7,a1,'t'];(二维数组)
数组的维度可以无限
多维数组中元素的获取:
var a2 = ['路飞','那么美' ,['巴基’,'小丑',['乔巴','索降']]];
例如要获取'乔巴':
['路飞','那么美' ,['巴基’,'小丑',['乔巴','索降']]] ==>a2[2]
['巴基’,'小丑',['乔巴','索降']] ==>a2[2][2]
['乔巴','索降'] ==>a2[2][2][1]
函数的声明和调用
问题:
1.回调函数是啥?
2.闭包是啥?
声明方式
1.关键字声明:
function 函数名(can1,can2,can3,...){
代码
}
2.表达式声明:
var f(函数名) = function(can1,can2,can3,...){
代码
}
注意:函数中return之后,不管有什么代码,都不会再执行
匿名函数与自调用
匿名函数:函数本身是没有名字的
例如:var fun = function(){
}
调用:fun(); ==>也就是将这个函数取过来加个小括号就能调用这个函数
将函数直接赋值给fun变量 后面直接拿这个变量名fun当作函数的名字
自调用函数(也叫做立刻执行函数):用括号将这个匿名函数括起来==>表明这个一个整体 然后后面加一个括号表示调用这个函数。
(function(){
alert(123);
})();
函数本身也是一种数据类型 typeof fun ==> function
把函数当作参数传入
- 无参函数
function test1(Func){
Func();
}
function test2(){
alert("我是test2");
}
test1(test2); //将test2这个无参函数传递给test1
- 有参函数
function test1(Func){
Func(mydata);
}
function test2(data){
alert(data);
}
test1(test2("hello")); //将test2这个无参函数传递给test1
3.匿名函数
function test1(Func){
Func("hello");
}
test1(function(data){
alert(data);
}); //这里就是传进了一个匿名函数
把函数当作返回值传出
把函数返回到外面才执行
function test(){
let say = function(){
console.log('Hi');
}
return say;
}
let fun = test();
fun();
变量提升
JS代码的运行分为两个阶段:
1.解析阶段:语法检查==>变量及函数进行声明
2.运行阶段:变量的赋值==>代码流程的执行
console.log(a); ==> var a;
var a=2; console.log(a);
a=2;
变量提升的意思就是:在代码流程运行之前,变量已经在解析阶段被声明了
作用域以及变量提升总结
如果函数声明和变量声明重名了,那么函数声明会覆盖变量声明
原因:变量提升==>导致变量声明在前,函数声明在后,因此覆盖
但是:最后console.log(a)==>1 这是因为赋值a=1在声明函数之后,所以又覆盖
作用域链(考点)
原理就是:如果在当前作用域中找不到这个变量,那么就一层一层(向上级作用域)向上找变量,在哪里先找到了就用哪个(到头可以找到全局作用域,要是还没有就会报错),这个过程形成的链条就叫做作用域链。
JS中的对象
对象的声明及使用
对象声明中,是以键值对的形式表示的
1.字面量声明对象(对象中数据都是键值成对存在的)
var obj1 = {age:12,tall:180,name:'hoho',fly:function(){}};
2.实例化方式声明对象(内置构造函数)
var obj2 = new Object();
3.实例化自定义构造函数方式声明对象:
自定义构造函数:
function Fun(){
}
实例化自定义构造函数:
var f = new Fun();
var obj2 = {
age:12,
tall:190,
name:'hoho',
fly:function(){
console.log(3);
}
}
获取对象的属性或方法:对象.属性名
console.log(obj2.tall);obj2.fly();
this是个对象(this永远指向的是一个对象)
重点:
this在什么情况下指向什么对象?
this.属性名
方法中的this就是这个方法所在的对象
注意,在普通函数中也是有this的,这个this指向全局对象(window)
function f(){ console.log(this); }
this的指向
this运行在哪个对象下(被哪个对象调用),就指向哪个对象
在这里输出age=16;
虽然this是写在o1下的,但是在o2中,o1.fun已经被当作一个值传递给了o2,然后o2.fun()调用这个fun()函数,因此是o2调用的,所以指向o2,所以返回o2.age ==> 16
对象的遍历及删除
for ... in 可以用来循环遍历对象、循环遍历数组
for(键 in 对象) 遍历对象
for (var k in obj1){
console.log(o1[k]);
}
for (var k in arr){
console.log(arr[k]);
}
删除对象中的属性:
delect obj1.age;
包装对象
三种原始类型:数值、字符串、布尔
(在一定条件下可以自动转为对象类型)==> 称为包装对象
例如:var v1 = new Number(123);
console.log(v1);
这三种原始类型,可以自动当作对象来调用,可以调用各种属性及方法
如果包装对象使用完成,会自动立即销毁
var a ='234';
a.length; 在.的这一刻 自动变为对象
标准库对象(内置对象)
一般就是包装对象的父对象
Math数字对象
Math.abs( )取绝对值
var n = -2;
var n2 = Math.abs(n);
console.log(n2);
Math.random( )返回一个浮点数,返回的随机数范围是[0,1)
想要返回范围在(a,b]之间的值:
Math.random( )*(b-a)+a
时间对象
//与Math不同 这里要实例化构造函数获取时间对象
var date = new Date();
console.log(n);
var n = Date.now();
console.log(n);
//返回的是从1970年1月1日00:00:00到现在经历的毫秒数
date.getHours() ==> 获取小时数
date.getDate() ==> 获取天数
date.getFullyear() ==> 获取年份
date.getMonth() ==> 得到的是当前月份-1(JS中的月份数组是从0开始的)
JS中获取的时间是计算机本地时间
Array数组对象
arr.push(k); ==>向数组末尾添加数组k
arr.pop(); ==> 将数组末尾的数字删除一个
以下方法不会改变现有的数组,而是建一个新数组:
- 浅拷贝(数组的复制):
arr2 = arr.slice(2,4) 复制下标[2,4)的数
- 数组合并:
arr3 = arr.concat(arr1)
- 将数组中的元素连接成一个字符串:
默认用逗号隔开
arr.join(); ==> 1,2,3,4
arr.join('-'); ==> 1-2-3-4
String字符串对象
str.indexOf('d'); ==> 返回字符串中第一次出现这个字符d的位置
str.substr(a,b); ==> 从下标a的数开始,往后shub个数,把这些数截取出来
str.toLowerCase(); ==> 全部字符转为小写
str.toUpperCase(); ==> 全部字符转为大写
str.replace('a','k'); ==> 返回:字符串中的‘a’全部替换为‘k’(原字符串不会改变)
str.trim();==>从一个字符串两端删除空白字符 包括空格 回车键等(在让客户输入密码时有用)
@author:Azuerky
ps: 第一篇js的笔记整理,之后还会更新js重点以及react笔记,欢迎各位大佬指正==