浏览器分为两部分
渲染引擎:用来解析HTML与CSS,俗称内核,之前讲过JS引擎:JS解释器,用来读取网页中的JavaScript代码,对其处理后运行在逐行读取HTML的时候,读到JS代码,JS引擎就会将其转换成0101的机器语言。翻译一句执行一句。
三种书写位置
行内内嵌外部和java/C++的语法一样
单行注释 ctri+/多行注释shift + alt + a一个装东西的盒子,一个存放数据的 容器
变量是程序在内存中申请的一块用来存放数据的空间
var是一个JS关键字,用来声明变量。(variable变量的意思)。使用该关键字声明变量后,计算机会自动为变量分配内存空间,不需要程序员接管。
// 声明变量 var age; // 赋值 age = 18; // 输出 console.log(age) // 直接初始化 var age = 19;弹出一个输入框,保存用户的输入
弹出对话框,输出用户输入的姓名
// 1. 用户输入姓名 var myname = prompt('输入您的姓名'); // 2. 输出 alert(myname)一个变量被重新赋值后,他原有的值就会被覆盖,变量值将以最后一次赋值为准
上面要是出错后,下面就不会执行。因为是一条条编译执行的。
不同数据占据的存储空间不同。为了充分利用存储空间,所以定义了不同数据类型
js的变量数据类型是只有在程序在运行过程中,根据等号右边的值来确定的,也因此可以随意变换(跟python一样)
简单数据类型(Number, String, Boolean, Undefined, Null)
简单数据类型说明默认值Number数字型 包含整形(8、10、16进制)和浮点型0Boolean布尔值类型,代表0,1falseString字符串,带引号“”Undefinedvar a; 没有赋值undefinedNullvar a = null; 为空值null复杂数据类型(Object)
JavaScript中数值的最大和最小值
alert(Number.MAx_VALUE); // l 1.7976931348623157e+308 alert (Number.MIN_VALUE); // 5e-324JavaScript中数值的最大和最小值
alert ( Infinity); // Infinity alert(-Infinity); // -Infinity alert(NaN); // NaN lnfinity ,代表无穷大,大于任何数值-Infinity ,代表无穷小,小于任何数值NaN ,Not a number,代表一个非数值isNaN()用来判断非数字,返回一个值
console.log(isNaN(12)); // false console.log(isNaN('12')); // false console.log(isNaN('?')); // true使用引号括起来。由于HTML里标签使用双引号,JS里面推荐使用单引号
JS支持引号嵌套(和python一样
undefined的相加
var variable = undefined; console.log(variable + 'pink'); // undefinedpink console.log(variable + 1); //NaN undefined和数字相加最后的结果是NaNnull的相加
var space = null; console.log(space + 'pink '); // nullpink console.log(space + true); // 1typeof可以用来获取检测变量的数据类型
var num = 10; console.log(typeof num); // number var str = 'uncledong'; console.log(typeof(str)); // string console.log(typeof null); // Object根据浏览器输出颜色看变量类型
console.log(18); // chrome: 蓝色, firefox: 绿色 console.log('18'); // 黑色 console.log(true); // chrome: 蓝色, firefox: 绿色 console.log(undefined); // 浅灰色 console.log(null); // 浅灰色字面量是在源代码中的一个固定值的表示法。
表单、prompt获得的数据默认是字符串类型的,此时不能直接简单的进行加法运算,需要进行 类型转换
转换为字符串类型
方法说明案例toString()转换成字符串var num = 1; alert(numtoString());String()强制转换转换成字符串var num = 1; alert(String(num));加号拼接字符串和字符串拼接好的都是字符串var num = 1; alert(String(num + ‘’));转换为数字型
方法说明案例parselnt(string)函数将string类型转换成整数数值型parselnt(‘78.9’) -> 78(被取整了,不会四舍五入)parseInt(‘120px’) -> 120(会去掉数字后面非数字的东西)机制:先看是否有数字,如果没有数字的话就是NaN parseInt(‘121a1a1a’)) -> 121parseInt(‘a21a1a1a’)) -> NaNparseFloat(String)函数转换成浮点数值parseFloat(‘78.1’)Number()强制转换转换成数值型Number(‘12’)js隐式转换( 加减乘除 )利用算术运算隐式转换成数值型console.log(‘12’ - 0)转换为布尔型
方法说明案例Boolean()函数其他类型转换成布尔值代表 空或者否定的值会被转换成false,如0, NaN, null, undefinedBoolean(‘true’) console.log (Boolean ( "')); // false console.log (Boolean(o)); // false console.log (Boolean (NaN)); // false console.log (Boolean (null)); // false console.log (Boolean (undefined)); // false console.log (Boolean (小白')); // true console.log (Boolean (12)); // true计算机不能直接理解机器语言之外的语言,因此需要把程序员的高级语言f安艺城机器语言才能执行。
翻译器翻译的方式有两种,区别在于编译的时间点不同
编译:代码执行之前进行编译,生成中间代码文件解释:运行时进行及时解释,立即执行标识符:开发人员为变量、参数、属性、函数取的名字。
关键字:编程语言已经使用了的字,不能再用来当作变量名,方法名
保留字:预留的关键字。现在还不是关键字,以后有可能成为关键字
数组名.length获取长度
通过索引号直接添加元素
var arr1 = [ 'red', 'green', 'blue']; arr1[3]= 'pink'; console.log(arr1);如果实参和形参不匹配,未匹配的形参将会变成undefined
两种声明方式
利用函数关键字function函数表达式。只有变量名没有函数名,因此称为 匿名函数一段程序代码中所用到的名字并不总是有效和可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域。作用域的使用提高了程序逻辑的局部性,增强了程序的可靠性,减少了名字冲突。
全局作用域:整个script标签,或者是一个单独的js文件局部作用域:在函数内部就是局部作用域。块级作用域就是{}中包含的定义,以下代码在别的语言是不会通过的。
if (3 < 5) { var num = 10; } console.log(num)最里面输出num的时候,一层层的往上找,找到那个num就用哪个num
JavaScript代码是由浏览器中的**JavaScript解析器(JS引擎)**来执行的。JavaScript解析器在运行JavaScript代码的时候分为两步 预解析和代码执行
预解析:js引擎会把js里面的所有var和function提升到当前作用域的最前面 变量提升:把所有变量声明提升到当前作用域最前面,不提升赋值操作函数提升:把所有的函数声明提升到最前面,不调用函数。赋值方式定义函数没法函数提升,因为有var,属于变量提升 按照代码书写的顺序从上往下执行对象是一个具体的事物,由属性和方法组成。
属性是事物的特征方法是事物的行为使用{},采用键值对保存属性和值
var obj = {} // 创建了一个空的对象 var obj = { username : '张三丰', age : '24', sex: '男', sayHi : function() { console.log('hi~') } }两种调用方法
// 方法1 console.log(obj.username); // 方法2 console.log(obj['username']); // 方法1调用函数 obj.sayHi(); // 方法2调用函数 obj.sayHi();直接新建后,赋值属性和方法
// 新建对象 var obj = new Object(); // 属性赋值 obj.username = '张三丰'; obj.sayHi = function() { console.log('hi~') }之前两种创建对象的方式一次只能创建一个对象,每次都要重新写所有的方法
// 构造函数的语法格式 function 构造函数吗() { this.属性 = 值; this.方法 = function() { } } // 新建对象 new 构造函数名(); // 构造四大天王 function Star(uname, age, sex) { this.name = uname; this.age = age; this.sex = sex; } // 新建对象 var liudehua = new Star('刘德华', 18, '男') console.log(liudehua) /* Star age: 18 name: "刘德华" sex: "男" __proto__: constructor: ƒ Star(uname, age, sex) __proto__: Object */ 构造函数名字首字母要大写构造函数不需要return就能返回结果调用构造函数必须要用new调用之后就能得到一个对象属性和方法前面要有this属性和方法都能遍历出来
for (属性(key) in 对象){ console.log(属性); console.log(对象[属性]); }推荐查阅文档 MDN
https://developer.mozilla.org/zh-CN/
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Math
Math对象不是 构造器(构造函数),里面的方法都是静态的。因此可以直接调用
不能出现字符串 -> NaN
封装自己的数学对象
var myMath = { PI: 3.141592653, // 使用argument接受所有参数 max: function() { var max = arguments[0]; for (var i = 1; i < arguments.length; i++){ if (arguments[i] > max){ max = arguments[i]; } } return max; }, // 使用argument接受所有参数 min: function() { var min = arguments[0]; for (var i = 1; i < arguments.length; i++){ if (arguments[i] < min){ min = arguments[i]; } } return min; } }https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Date
var date = new Date(); console.log(date) date2 = new Date(2019,0,1); // 下标从0开始,January 方法名说明代码getFullYear()获得当前年dObj.getFullYear()getMonth()获取当前月(0-11)getDate()当前日期getDay()当前星期几(周日0-周六6)getHours()当前小时getMinutes()当前分钟getSeconds()当前秒钟学方法四部曲
方法是干什么的参数是什么结果是什么demo测试使用三元运算符让日期输出更加美观
var time = new Date(); var h = time.getHours(); h = h < 10 ? '0' + h : h; var m = time.getMinutes(); m = m < 10 ? '0' + m : m; var s = time.getSeconds(; s = s < 10 ? '0' + s : s; return h +':'+m+ ':'+ s;Date对象基于1970.1.1的毫秒数开始计算的
// 1. 普通方法 var date = new Date(); console.log(date.valueof()); // 现在时间距离1970.1.1的毫秒数 console.log(date.getTime()); // 跟上面一样 // 2. 最通用的方法 var date1 = +new Date(); // 直接返回总的毫秒数 //3. H5新增的方法 console.log(Date.now());毫秒数是永远不会重复的,因此作为时间戳
倒计时算法
d = parselnt(总秒数/60/60/24); // 计算天数h = parselnt(总秒数/60/60$); // 计算小时m = parselnt(总秒数/60`); // 计算分数s = parselnt(总秒数`); // 计算当前秒数 function countDown(time){ // 返回当前时间总毫秒数 var nowTime = +new Date(); // 用户输入时间的总毫秒数 var inputTime = +new Date(time); // 剩余时间毫秒数 var times = (inputTime - nowTime) / 1000; d = parselnt(times/60/60/24); // 计算天数 h = parselnt(times/60/60%24); // 计算小时 m = parselnt(times/60%60); // 计算分数 s = parselnt(times%60); // 计算当前秒数 return d + '天:' + h + '时' + m + '分' + S + '秒'﹔ }instanceof 运算符 可以检测是否为数组
var arr = []; console.log(arr instanceof Array);Array.isArray(变量)
字符串可以直接调用方法,但字符串是基本数据类型,不是对象,这是咋回事?
var str = 'andy'; console.log(str.length); // 不会报错把简单数据类型包装成复杂数据类型,步骤如下
新建复杂类型
var temp = new String('andy');把临时变量的值给str
str = temp;销毁这个临时变量
temp = null;每次变换字符串的内容,都会新建一个字符串的空间存放数据。字符串所有的方法,都不会修改字符串本身。操作完成会返回一个新的字符串。
使用charAt(下标)的方法返回字符
简单数据类型:值类型
复杂数据类型:引用类型
简单数据类型/基本数据类型,在存储时变量中存储的是值本身,因此叫做值类型string, number, bollean, undefined, null
null返回的还是object类型,这是之前设计有误
如果有变量,以后打算存储为对象,暂时没想好放啥,就可以赋值null
复杂数据类型。存储时变量中存储的仅仅是地址(引用),因此叫做引用数据类型。通过new关键字创建的对象(系统对象、自定义对象),如Object, Array, Date等。