变量(variable):它不是具体的值,只是一个用来存储具体值的容器或者代名词
JS中创建变量的方式
- var (ES3)
- function (ES3) 创建函数(函数名也是变量,只不过存储的值是函数类型而已)
- let (ES6)
- const (ES6) 创建的是常量
- import (ES6) 基于ES6的模板规范导出需要的信息
- class (ES6) 基于ES6创建类
let / const 和 var 的区别
1、let和const不存在变量提升,只有var和function有变量提升
2、var允许重复声明,let不允许,在相同作用域中(或执行上下文中),使用var和function关键词声明变量并且重复声明,声明一次过后不在重复声明但需要重新赋值。let和const不能重复声明(不管之前是通过什么办法只要在当前栈内存存在这个变量,使用let和const重复声明变量都会报错),重新声明会报错
a = 12;let a = 13;console.log(a); var a = 12;let a = 13;console.log(a);
都会报错
3、let能解决typeof检测时出现的暂时性死区问题
变量命名规范
- 严格区分大小写
- 遵循驼峰命名法:按照数字、字母、下划线(一般下划线在前面的都是公共变量)或者$(一般存储的都是JQ元素)来命名(数字不能作为名字的开头),命名的时候基于英文单词拼接成一个完整的名字(第一个单词字母小写,其余每一个有意义单词的首字母都大写)。
- 不能使用关键字和保留字:在JS中有特殊含义的叫做关键字,未来可能成为关键字的叫做保留字
JS中的数据类型
- 基本数据类型(值类型)
数字 number
字符串 string
布尔 boolean
null
undefined - 引用数据类型
对象 object(普通对象,数组对象,正则对象,日期对象...)
函数 function - ES6中新增加的一个特殊的类型:Symbol,唯一的值
数据类型剖析
一、number数字类型
NaN:not a number 但是它是数字类的
isNaN:检测当前值是否不是有效数字(数字类型中除了NaN不是有效数字,其余都是有效数字),返回true代表不是有效数字,返回false是有效数字
isNaN检测机制:
1、首先验证当前要检测的值是否为数字类型,如果不是浏览器默认把值转换为数字类型
2、当前检测的值已经是数字类型,是有效数字返回false,不是返回true(number,布尔,null都是有效数字)
引用数据类型转换为数字:先把引用值调取toString转换为字符串,然后再把字符串调取Number转换为数字
二、布尔类型只有0,null,NaN,“”,undefined这五个值转换为布尔类型的值是false,其他都是true
三、null和undefined
null:空对象指针 声明变量并赋值为null
undefined:未定义 声明变量不赋值
四、对象数据类型
1、普通对象
1、由大括号包裹起来
2、由零到多组属性名和属性值(键值对)组成,属性名一般是字符串或者是数字。如果属性名不是字符串或数字,浏览器会把这个值转换为字符串,然后在进行储存
假删除让当前对象属性值为空:obj["age"] = null // obj.age = null
彻底删除对象中的属性:delete obj["age"] // delete obj.age
2、数组对象
数组对象的属性名是数字(属性名为对象的索引)
扩展:JS代码如何被运行以及运行后如何输出结果
如何运行
1、浏览器加载HTML页面时,首先会提供一个供全局JS代码执行的环境称之为全局作用域全局作用域在后台用global 表示,在js中用 window 表示
2、代码自上而下执行(之前还有一个变量提升阶段)
基本数据类型的值会存储在当前的作用域下。
var a = 12; 首先在作用域中声明一个变量a,然后开辟一个空间存储12,最后让声明的变量和12进行关联,12赋值给a,赋值操作叫做定义。
基本数据类型是按照值来操作的,把原来的值复制一份放到新的空间或者位置上
和原来值没有关系
引用数据类型的值不能直接存储到当前的作用域下,直接开辟一个新的空间并把内容存储进来
var obj1 = {n: 100},首先开辟一个新的内存空间(为了保证后面可以找到这个空间,此空间由一个16进制的地址),把对象中的键值对依次存储起来,然后声明一个变量,最后让变量和空间地址关联一起,
引用类型不是按照值来操作,它操作的是空间的引用地址,把原来空间地址赋值给新的变量,但原来的空间没有被克隆,还是一个空间,这样就会出现多个变量关联的是相同的空间,相互之间就会存在影响。
案例:
var obj = {n: 10, m: obj.n * 10};
console.log(obj.m) //报错,首先开辟一个新的堆内存xxxfff000,把键值对存储到堆内存中n: 10, m: obj.n * 10,此时堆内存信息还没有存储完成obj.n还没有值,空间的地址还有没给obj,obj是undefined,obj.n就是undefined.n所以报错
如何输出结果
-
alert:在浏览器中通过弹窗的方式输出(浏览器提示框),基于alert输出的结果都会转换为字符串,把值(如果是表达式先计算出结果)通过toString这个方法转换为字符串,然后在输出。
alert(1+1) => "2"
,alert一个对象输出结果为"[object Object]"
- confirm:和alert的用法一致,只不过提示框中有确定和取消两个按钮,所以它也是确认提示框
- prompt:在confirm的基础上增加输入框,不常用
- console.log:在浏览器控制台输出日志
- console.dir:比log输出的更加详细一些(尤其输出对象数据值的时候)
-
console.table:把一个JSON数据按照表格的方式输出
还有更多console输出方法......
网友评论