目录
一、js 的数据类型
Number Boolean String Null Undefined 以上五种叫做基本数据类型
Object 对象
对象属于一种复合的数据类型,在对象中可以保存多个不同数据类型的属性
对象的分类
1、内建对象
--有es标准中的对象,在ES中的任何实现都能使用
比如Math String Number Boolean Function Object
2、宿主对象
-- 由js环境提供的对象,目前主要是浏览器提供的对象
比如BOM DOM
3、自定义对象
由开发人员自建的对象
1、对象操作
//1、创建对象
var obj = new object();
//2、添加对象的属性
obj.name = "sin";
obj.sex = "女";
obj.age = 18;
//3、读取对象的属性 如果对象中的属性时则为 undefined
console.log(obj.name); //值为"sin"
console.log(obj.hello); //值为"undefined"
//4、修改对象的属性 对象.属性 = 修改的值
obj.name = "cos";
//5、删除对象的属性 delete 对象.属性
delete obj.name;
<script type="text/javascript">
// 创建对象
//使用new关键字的函数是构造函数 constructor
//构造函数是专门用来创建对象的
//typeof检查一个对象时,会返回一个object
var obj = new Object();
console.log(obj);
//向对象中添加属性 直 接对象.属性 = 值
obj.name="sin";
obj.sex="女";
obj.age =18;
console.log(obj);
//读取对象中的属性 对象.属性
console.log(obj.age);
</script>
2、对象中的属性名
1、属性名不强制遵守标志符的规则
eg:var obj = new Object();
obj.var ="sin";
2、如果使用特殊的属性的时候需要采用 对象["属性名"]
//obj.123 = "sin";这是一个错误的
obj["123"] = "sin";
console.log(obj["123"]);//这是正确的选项
特别说明 使用[]更加灵活
在[]可以传递一个变量,
var n = "123";
var n ="你好";
console.log(obj[n]);
3、对象中的属性值
1、属性值可以是任意的数据类型,当然也可以是数据对象
2、我们如何判断某个对象中的属性是否存在
"属性" in 对象
如果有则返回true,否则则返回false
<script type="text/javascript">
// 创建对象
//使用new关键字的函数是构造函数 constructor
//构造函数是专门用来创建对象的
//typeof检查一个对象时,会返回一个object
var obj = new Object();
var obj2 = new Object();
obj2.name = "sin";
obj2.sex = "男";
obj2.age =11;
obj.test = obj2;
console.log(obj);
console.log("sex" in obj2);
console.log("name" in obj);
</script>
4、可以根据对象的字面量进行
语法: {属性名:属性值,属性名:属性值}
<script type="text/javascript">
var a = {
name : 123,
sex:"男",
age:22
test:{name:"sin"}
}
console.log(a.test); //也是一个Object
</script>
二、数据基本类型和引用类型
//基本数据结构类型开辟的内存叫做栈内存
//引用数据结构类型开辟的内存叫做堆内存
<script type="text/javascript">
var a = 123;
var b = a;
a++;
console.log(a); //a 的值是124
console.log(b); //b的值是123
console.log(a == b);
//因为基本数据类型开辟的是栈内存,然后只是将值进行了复制,他们之间是相互独立的,他们比的都是值
var c = new Object();
c.name = "sin";
var d = c;
d.name ="cos";
console.log(c);
console.log(d);
console.log(c == d);
//引用数据类型开辟的是堆内存,栈内存保存的是堆内存的地址,所以c==d比的都是堆内存的地址
</script>
3、函数
3、1函数创建的三种方式
1、函数也是一个对象,可以进行封装一些功能
//创建一个函数的对象,可以将封装的代码按照字符串的形式传递给构造函数
var fun = new Function("console.log('Hello'));
//调用函数 对象()
fun();
2、使用函数声明来创建一个函数
//语法: function 函数名([形参1,形参2,形参3])
function fun(){
}
fun();
3、使用函数表达式来创建一个函数
var 函数名 = function(){
}
var fun = function([形参1,形参2,形参N]){
}
fun();
3、2函数的参数
调用函数的参数时,不会检查实参的类型,后果--->所以可能会接受到非法的参数
也不会检查的实参的数量,多余的实参不会赋值 后果 ---->没有对应实参的形参将是undefined
实参是一个对象,他也是一个函数
<script type="text/javascript">
// console.log(b);
//创建一个函数,可以在控制台中输出一个人信息,名字,年龄,性别,地址
function person(name,age,sex,address) {
// var c = new Object();
var c = {};
c.name = name;
c.age = age;
c.sex = sex;
c.address = address;
return c;
}
var c = person("sin",13,"女","南昌");
console.log(typeof c);
console.log(c);
//可以使用对象进行操作
function sum(obj) {
console.log(obj.name+"n年芳"+obj.age+"性别"+obj.sex+"地址"+obj.address);
}
var obj = {
name:"sin",
age:13,
sex:"女",
address:"南昌"
}
sum(obj);
//实参也可以是是一个函数
function fun(a) {
a(obj);
}
fun(sum);
fun(function (m) {
console.log("你就是个弟弟");
})
</script>
3、3函数的返回值
//用return ;返回的是undefined ,你不写return也是undefined
function fun(a,b){
var d = a+b;
return d;
}
var res = fun(1,2);
console.log(res);
举例
<script type="text/javascript">
//以下三个函数都是求解偶数
function fun(a) {
var b = !!(a%2);
return b;
}
var c = fun(3);
console.log(fun(2));
console.log(c);
function fun2(a) {
return (a%2) === 0 ;
}
console.log(fun2(2));
function fun3(a) {
if(a%2==0){
return true;
}else{
return false;
}
}
console.log(fun3(1));
</script>
四、方法
1、对象的属性值可以是任意的数据类型,也可以是个函数
函数也可以称为对象的属性
如果一个函数作为对象的属性保存,我们称这个函数是对象的方法,调用函数就是调用这个对象的方法
<script type="text/javascript">
var obj = new Object();
obj.name = "sin";
obj.age = 12;
obj.sayName = function () {
console.log("你就是一个弟弟");
};
//函数
function fun(){
console.log("你就个弟弟");
}
//函数的调用
fun();
//方法的调用
obj.sayName();
</script>
五、枚举对象中的属性
语法:使用for....in语句
当变量作为属性名的时候,用[]
<script type="text/javascript">
var obj ={
name:"sin",
age:100,
sex:"男",
address:'你家在哪'
};
for(var a in obj){
console.log("属性名"+a);
console.log("属性值"+obj[a]);
}
</script>
刘、作用域(重点,面试会问),变量声明提前
作用域是指一个变量的范围,有两种,
声明统一提前,赋值原地不变
1、全局作用域
-直接编写在script标签的中的js代码,都在全局作用域
-全局作用域在页面打开是创建,在页面关闭时销毁
-在全局作用域中有一个全局对象window
window代表一个浏览器的窗口,他有浏览器创建我们可以直接使用
-在全局作用域中:
创建的变量都会作为window的属性保存
2、函数(局部)作用域
2、1在函数作用域中,可以访问到全局作用域
在全局作用域中,访问不到函数作用域
2、2在函数作用域中,他会在自身作用域中查找,如果没有的花,就会去上一层查找,如果在全局作用域中都没有找到的话,就会报reference error
2、3在函数中没使用var声明的变量,都会变成全局变量
2、4定义了形参就相当于在函数中声明了一个变量
3、声明变量提前
3、1使用var关键字声明的变量,会在所有代码执行之前声明
3、2使用函数声明创建的function fun(){}会在所有代码执行前就会被创建
函数表达式
<script type="text/javascript">
//全局变量举例
var c = "sin";
console.log(c); //"sin"
console.log(window.c);//"sin"
//console.log(m);报错
console.log(window.m); //undefined
function f() {
console.log("zs是个弟弟");
}
console.log(f()); //zs是个弟弟
window.f(); //zs是个弟弟
console.log(window.f()); //这里放回的undefined的,因为没有返回值
</script>
<script type="text/javascript">
//函数的形参相当于声明了函数的变量
function fun(e){
console.log(e); //undefined
}
fun();
</script>
<script type="text/javascript">
//3\变量的声明提前:
/*
使用var关键字声明的变量,会在所有代码执行之前声明(undefined),在执行赋值语句才会赋值
*/
console.log("a="+a); //undefined
var a = 123; //123
</script>
//关于函数变量提升和声明变量提升那个优先级更高
var getName = function(){
console.log(2);
}
function getName (){
console.log(1);
}
getName();
function getName(){ //函数声明提升到顶部
console.log(1);
}
var getName; //变量声明提升
getName = function(){ //变量赋值依然保留在原来的位置
console.log(2);
}
getName(); // 最终输出:2
使用小技巧 ---->在chrome的debug模式
1、第一步,打开开发者工具,然后在在sources里面单击哪一行哪一行就开始调试
2、可以选着某个变量进行查看(因为谷歌的全局变量太多了)Add Select text to Watches
3、按照f10进行一下步调试
浙公网安备 33010602011771号