读书使人充实,讨论使人机智,笔记使人准确…。凡有所学,皆成性格。
———— (英国)培根
JavaScript简介
DOM:页面文档对象模型
BOM:浏览器对象模型
为了方便信息的输入输出,JS中提供了一些输入输出语句,其常用的语句如下:
方法 | 说明 | 归属 |
---|---|---|
alert(msg) | 浏览器弹出警示框 | 浏览器 |
console.log(msg) | 浏览器控制台打印输出信息 | 浏览器 |
prompt(info) | 浏览器弹出输入框,用户可以输入 | 浏览器 |
本质:变量是程序在内存中申请的一块用来存放数据的空间(声明一个变量开辟一块新的空间)
声明一个变量并赋值,我们称之为变量的初始化
var age = 18; var age = 'pink老师';
<script> // 1.用户输入姓名 存储到一个myname的变量里 var myname = prompt('请输入你的名字'); // 2.输出这个用户名 alert(myname) </script>
var age =18 age=81 //最后的结果就是81,因为18被覆盖掉了
var age=18, address='wasdon', salary=2000;
声明变量的特殊情况
情况 | 说明 | 结果 |
---|---|---|
var age; console.log(age) | 只声明不赋值 | undefined |
console.log(age) | 不声明 不赋值 直接使用 | 报错 |
age=10; console.log(age) | 不声明只赋值 | 10 |
javascript的变量数据类型是只有程序在运行中,根据等号右边的值来确定的
var num=10 // num属于数字型 var str='java' //str属于字符串型
javascript是动态语言,变量数据类型是可以变化的
var x=10 // x是数字型 x='java' //x是字符串型
isNaN()方法
isNaN(x) | |
---|---|
x是数字 | 返回false |
x不是数字 | 返回true |
方式 | 说明 | 案例 |
---|---|---|
toString() | 转成字符串 | var num=1; alert(num,toString()); |
String() | 转成字符串 | var num=1; alert(String(num)); |
加号拼接字符串 | 和字符串拼接的结果都是字符串 | var num=1; alert(num+“我是字符串”); |
方式 | 说明 | 案例 |
---|---|---|
parselnt(string)函数 | 将 string类型转成整数数值型 | parselnt(‘78’) |
parseFloat( string)函数 | 将 string类型转成浮点数数值型 | parseFloat(‘78.21’) |
Number()强制转换函数 | 将 string类型转换为数值型 | Number(‘12’) |
js隐式转换(-*/) | 利用算术运算隐式转换为数值型 | ‘12’-0 |
隐式转换是我们在进行算数运算时,js自动转换了数据类型
方式 | 说明 | 案例 |
---|---|---|
Boolean() | 其他类型转成布尔值 | Boolean(’true‘) |
代表为空,否定的值会被转换为false,如’’,0,NaN.null,unfined
其他值都会被转换为true
当我们不确定有多少个参数传递的时候,可以用arguments来获取。在 JavaScript中, arguments3实际上它是当前函数的一个内置对象。所有函数都内置一个 arguments对象, arguments对象中存储了传递的所有实参
arguments展示形式是一个伪数组,因此可以进行遍历。伪数组具有以下特点:
●具有 length属性
●按索引方式储存数据
●不具有数组的push,pop等方法
function fn() { console.log(arguments) console.log(arguments.length) console.log(arguments[2]) //我们可以按照数组的方式遍历arguments for (var i = 0; i < arguments.length; i++) { console.log(arguments[i]) } } fn(1, 2, 3, 4, 5)
冒泡排序
//冒泡排序 var arr = [5, 4, 3, 2, 1] for (var i = 0; i <= arr.length - 1; i++) {//外层循环管趟数 for (var j = 0; j <= arr.length - i - 1; j++) {//里层循环管每一趟交换次数 //内部交换2个变量的值,前一个和后一个相比较 if (arr[j] > arr[j + 1]) { var temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } console.log(arr)
我们js引擎运行js分为两步:预解析和代码执行
预解析分为变量预解析(变量提升)和函数预解析(函数提升)
利用字面量创建对象
var obj = {};//创建了一个空对象 var obj = { uname: "jack", age: 18, sex: 'man', sayHi: function () { console.log('hello'); } } console.log(obj.uname) //调用方式1 console.log(obj['uname']) //调用方式2 obj.sayHi() //调用函数
利用new Object创建对象
var obj = new Object();//创建了一个空对象 obj.uname = "jack"; obj.age = 18; obj.sex = 'man'; obj.sayHi = function () { console.log('hello'); }
利用构造函数创建对象
构造函数首字母要大写
调用构造函数,必须使用new
function Star(uname, age, sex) { this.uname = uname; //this表示当前 this.age = age; this.sex = sex; } var ldh = new Star('刘德华', 18, '男');//调用函数返回一个对象 var zxy = new Star('张学友', 19, '男');
●构造函数,如 Stars(),抽象了对象的公共部分,封装到了函数里面,它泛指某一大类( class)
●创建对象,如 new Stars(),特指某一个,通过new关键字创建对象的过程我们也称为对象实例化
遍历对象属性
for…in语句用于对数组或者对象的属性进行循环操作
var obj = { uname: "jack", age: 18, sex: 'man', sayHi: function () { console.log('hello'); } } for (var k in obj) { console.log(k); // k是变量 输出 属性名 console.log(obj[k]); // obj[k] 输出属性值 }
内置对象
自定义对象
内置对象
浏览器对象(Js独有)
查阅文档 MDN 网络文档 (mozilla.org)
两个数之间的随机整数,包含这两个整数
function getRandom(mim,max){ return Math.floor(Math.random()*(max-min+1)) + min }
方法名 | 说明 | 代码 |
---|---|---|
getFullYear() | 获取当年 | dObj. getFullYear() |
getMonth() | 获取当月(0-11) | dObj. getMonth() |
getDate() | 获取当天日期 | dObj. getDate() |
getDay() | 获取星期几(周日0 到周六6) | dObj. getDay() |
getHours() | 获取当前小时 | dObj. getHours() |
getMinutes() | 获取当前分钟 | dObj. getMinutes() |
getSeconds() | 获取当前秒钟 | dObj. getSeconds() |
数组元素增删改
方法名 | 说明 | 返回值 |
---|---|---|
push(参数1…) | 末尾添加一个或多个元素,注意修改原数组 | 并返回新的长度 |
pop() | 删除数组最后一个元素,把数组长度减1无参数、修改原数 | 返回它删除的元素的值组 |
unshift(参数1…) | 向数组的开头添加一个或更多元素,注意修改原数组 | 并返回新的长度 |
shift() | 删除数组的第一个元素,数组长度减1无参数、修改原数组 | 并返回第一个元素的值 |
数组排序
方法名 | 说明 | 是否修改原数组 |
---|---|---|
reverse() | 颠倒数组元素的顺序,无参数 | 该方法会改变原来的数组,返回新数组 |
sort() | 对数组元素排序 | 该方法会改变原来的数组,返回新数组 |
var arr = [13, 4, 77, 1, 7]; arr.sort(function (a, b) { return a - b; //升序 return b - a; //降序 }); console.log(arr);
数组索引方法
方法名 | 说明 | 是否修改原数组 |
---|---|---|
indexOf() | 数组中查找给定元素的第一个索引 | 如果存在返回索引号,如果不存在,返回-1 |
lastIndexOf() | 在数组中的最后一个索引 | 如果存在返回索引号,如果不存在,返回-1 |
数组去重(将旧数组赋给新数组)
function unique(arr) { var newArr = []; for (var i = 0; i < arr.length; i++) { if (newArr.indexOf(arr[i]) === -1) { //===全等,包括数值和数据类型 newArr.push(arr[i]); } } return newArr; } var demo = unique(['c', 'a', 'z', 'a', 'x', 'a', 'x', 'c', 'b'])
数组转换为字符串
方法名 | 说明 | 是否修改原数组 |
---|---|---|
toString() | 把数组转换成字符串,默认逗号分隔每一项 | 返回一个字符串 |
join(‘分隔符’) | 把数组中所有的元素转换成一个字符串 | 返回一个字符串 |
concat() | 连接两个或多个数组,不影响原数组 | 返回一个新数组 |
slice() | 数组截取slice(begin,end) | 返回被截取项目的新数组 |
splice() | 数组删除splice(第几个开始,删除的个数) | 返回被删除项目的新数组,影响原数组 |
字符串不可变(只改变地址,不改变内容)
var str = 'abc' str = 'hello'
graph LR abc- str--->hello-
案例
查找字符串"abcoefoxyozzopp"中o出现的位置和次数
核心算法:先查找第一个o出现的位子
只要indexOf返回的结果不是-1就继续查找
indexOf只能查找第一个,所以后面的查找,利用第二个参数,当前索引加1,继续查找
var str = "abcoefoxyozzopp"; var index = str.indexOf('o'); while (index !== -1) { console.log(index); index = str.indexOf('o', index + 1); }
根据位置返回字符
方法名 | 说明 | 使用 |
---|---|---|
charAt(index) | 返回指定位置的字符 | str.charAt(0) |
charCodeAt(index) | 获取定位置处的字符ASCII码 | str.charCodeAt(index) |
str[index] | 获取定位置处的字符 | HTML5,IE8+支持和charAt()等效 |
案例
判断一个字符串"abcoefoxyozzopp"中出现次数多的字符,并统计其次数。
核心算法:利用 charAt()遍历这个字符串
把每个字符都存储给对象,如果对象没有该性,就为1,如果存在了就+1
遍历对象,得到最大值和该字符
var str = "abcoefoxyozzopp"; var o = {}; for (var i = 0; i < str.length; i++) { var chars = str.charAt(i); if (o[chars]) { o[chars]++ } else { o[chars] = 1; } } console.log(o); var max = 0; //声明变量 var ch = '';//声明变量 //遍历对象 for (var k in o) { //k得到的是属性名,o[k]得到的是属性值 if (o[k] > max) { max = o[k]; ch = k; } } console.log(max); console.log('最多的字符是' + ch);
字符串操作方法
方法名 | 说明 |
---|---|
concat(str1,str2,str3…) | concat()方法用于连接两个或多个字符串。拼接字符串,等效于+,+更常用 |
substr(start,length) | 从 start位置开始(索引号), length取的个数,重点记住这个 |
slice(start, end) | 从 start位置开始,截取到end位置,end取不到(他们俩都是索引号) |
substring(start, end) | 从 start位置开始,截取到end位置,end取不到本和 slice相同但是不接受负值 |
简单类型又叫做基本数据类型或者值类型,复杂类型又叫做引用类型
值类型:简单数据类型/基本数据类型,在存储时变量中存储的是值本身,因此叫做值类型string,number,boolean,undefined, null(可用于临时存放空对象)
引用类型:复杂数据类型,在存储时变量中存储仅仅是地址(引用),因此叫做引用数据类型通过new关键字创建的对象(系统对象、自定义象),如 Object, Array,Date等
堆栈空间分配区别:
1、栈(操作系统):由操作系统自动分配释放存放函数的参数值、局部变量的值等。其操作方式类似于数据结构中的栈。
简单数据类型存放到栈里面
2、堆(操作系统):存储复杂类型(对象),一般由程序员分配释放,若程序员不释放,由垃圾回收机制回收。
复杂数据类型存放到堆里面
简单数据类型:是存放在栈里面,里面直接开辟一个空间存放的是值
复杂数据类型:首先在栈里面存放地十六进制表示,然后这个地址指向堆里面的数据