整理之前学习一些视频的笔记
引入
var str=parseInt(prompt("请输入一个数字"));
console.log(str);
为什么结果是NaN???
没转换成功,说明prompt(“请输入一个数字”)有问题
var str=prompt("请输入一个数字");
console.log(str);
结果显示为空
var str=prompt("请输入一个数字");
console.log(isNaN(str));
结果显示false,如果是false,说明此处-----prompt(“请输入一个数字”);------是NaN
var str=prompt("请输入一个数字");
//用户没有输入内容
if(str==""){
console.log("您输入有误")
}else{
//用户输入内容了
if(!isNaN(parseInt(str))){
console.log("您输入的是一个数字");
//调用一个函数,把这个数字传入到函数中,判断该数字是不是质数
}else{
console.log("您输入的不是一个数字");
}
}
//如何判断一个数字是质数
var num=11;
function isPrimeNumber(num){
for(var i=2;i<=num/2;i++){
if(num%i==0){
return false;
}
}
return true;
}
console.log(isPrimeNumber(num));
函数
把一些重复的代码封装在一个地方,在需要的时候直接调用这个地方的代码就可以了
函数作用:代码重用
函数的参数:
1.形参:函数定义的时候,函数名字后面的小括号里的变量
2.实参:函数调用的时候,函数名字后面的小括号里的变量或者值
返回值:
- 函数中有return,函数有返回值
- 函数中没有return,函数没有返回值
- 没有明确返回值:函数中没有return或者return后面没有任何内容
- 如果一个函数没有明确的返回值,接收这个函数,结果是undefined
无参数无返回值的函数
无参数有返回值的函数
有参数无返回值的函数
有参数有返回值的函数
arguments
- 可以获取函数调用的时候,传入的实参的个数
- arguments是一个对象,是一个伪数组
- arguments.length—>是实参的个数
- arguments[索引]---->实参的值
作用域
变量的使用范围
- 全局作用域:全局变量在任何位置都可以使用的范围
- 局部作用域:局部变量只能在某个地方使用—函数内
作用域链
在一个函数中使用一个变量,先在该函数中搜索这个变量,找到了则使用,找不到则继续向外面找这个变量,找到则使用,一直找到全局作用域,找不到则是undefined
- 全局变量:只要是在函数外面声明的变量都可以看成或者是理解成是全局变量
- 局部变量:在函数中定义的变量
预解析
在执行代码之前做的事情
- 变量的声明和函数的声明被提前了,变量和函数的声明会提升到当前所在的作用域的最上面
- 函数中的变量声明,会提升到该函数的作用域的最上面(里面)
- 如果有多对的script标签都有相同名字的函数,预解析的时候是分段的,互不影响
创建对象的不同的方式
- 调用系统的构造函数创建对象
var 变量名=new Object(); - 自定义构造函数创建对象
- 字面量的方式创建对象
编程思想:把一些生活中做事的经验融入到程序中
面向过程:凡事都要亲力亲为,每件事的具体过程都要知道,注重的是过程
面向对象:根据需求找对象,所有的事都用对象来做,注重的是结果
面向对象特性:封装,继承(类与类,但是js没有类的概念),多态 (抽象性)
- js只有封装,其他两个特性只能模拟
- js不是面向对象的语言,但是可以模拟面向对象的思想
- js是一门基于对象的语言:就是本身有对象,不需要去创建
万物皆对象
什么是对象?
灌输思想:有了对象,就有了…
看的见,摸得到,具体特指的某个东西
学生是类 黄学生是对象
小狗是一类的东西 我家的狗是对象
分析对象有什么特点
特征和行为
- 对象:有特征和行为,具体特指的某一个事物
- 对象:有属性和方法,具体特指的某个事物
- 调用系统的构造函数创建对象
var 变量名= new Object();
Object 是系统的构造函数 Array
- 自定义构造函数创建对象(结合第一种和需求通过工厂模式创建对象)
- 字面量的方式创建对象
//实例化对象:小苏
//创建对象,把对象放进变量obj里面去了
var obj=new Object();
//对象有特征--属性和行为----方法
//添加属性----如何添加属性? 对象.名字=值;
obj.name="nina";
obj.age=18;
obj.sex="女"
//添加方法----如何添加方法? 对象.名字=函数;
obj.eat=function(){
console.log("我喜欢吃油炸榴莲凉拌臭豆腐和大蒜")
};
obj.play=function(){
console.log("我喜欢玩飞机模型");
};
obj.cook=function(){
console.log("切菜");
console.log("洗菜");
console.log("煮菜");
console.log("出锅");
console.log("放料");
console.log("吃菜");
}
console.log(obj.name);//获取---输出了
console.log(obj.age);
console.log(obj.sex);
obj.eat();//函数调用得加括号
obj.play();
obj.cook();
- 工厂模式创建对象
function createObject(name, age) {
var obj = new Object();
//添加属性
obj.name = name;
obj.age = age;
//添加方法
obj.sayHi = function () {
console.log("你好呀,我叫" + this.name + "\n"+"我今年" + this.age+"岁了");
};
return obj;
}
//创建人的对象
var per1 = createObject("aa", 18);
per1.sayHi();
//创建一个人的对象
var per2 = createObject("bb", 19);
per2.sayHi();
自定义构造函数创建对象,自己定义一个构造函数,自定义构造函数,创建对象
函数和构造函数的区别
名字是不是大写(首字母是大写)
用法没什么区别,几乎一模一样,构造函数也可以当作普通函数一样用
系统的函数:Object
function Object(value){}
注意:
如果写的是普通函数,主要是为了调用!!!
构造函数 目的 是为了 创建对象!!!
function Person(name,age) {
//写了系统函数,也相当于不是自定义的
//var obj=new Object();
this.name = name;
this.age = age;
this.sayHi = function () {
console.log("我叫" + this.name + ",年龄是" + this.age+"岁");
}
//return obj;
}
// Person();
//自定义构造函数创建对象:先定义一个构造函数,创建对象
var obj=new Person("lily",11);
console.log(obj.name);
console.log(obj.age);
obj.sayHi();
var obj2=new Person("john",12);
console.log(obj2.name);
console.log(obj2.age);
obj.sayHi();
console.log(obj instanceof Person);
console.log(obj2 instanceof Person);
//定义狗的构造函数,创建对象
function Dog(name,age,sex){
this.name=name;
this.age=age;
this.sex=sex;
}
var dog=new Dog("大黄",11,"男");
console.log(dog instanceof Person);
console.log(dog instanceof Dog);
定义构造函数创建对象做了几件事?
当这个代码执行时,发生了四件事!系统做的!
var obj=new Person("小明",10);
- 在内存中开辟(申请一块空闲的空间)空间,存储创建的新的对象
- 把
this
设置为当前的对象 - 设置对象的属性和方法的值
- 把
this
这个对象返回
//创建一个图片的对象,图片有宽,有高,有大小(4M),图片可以展示内容
//创建一个小猫的对象,猫有颜色,体重,年龄,小猫可以抓耗子,可以打架
function Picture(width, height, size) {
this.width = width;
this.height = height;
this.size = size;
this.showPicture = function () {
console.log("宽是" + this.width + ",高是" + this.height + ",大小是" + this.size);
}
}
function littleCat(color, weight, age) {
this.color = color;
this.weight = weight;
this.age = age;
this.fight = function () {
console.log("颜色是" + this.color + ",体重是" + this.weight + ",年龄是" + this.age);
}
}
//1 调用构造函数创建对象
var obj=new Object();
//2. 自定义构造函数创建对象
//自定义构造函数
function Person(name,age) {
this.name=name;
this.age=age;
this.sayHi=function () {
console.log("您好,我叫:"+this.name);
};
}
//创建对象----实例化一个对象,并初始化
var per=new Person("小明",20);
per.name="张三";
再次强调四件事:
1.开辟空间,存储创建的新的对象
2.把this设置为当前的对象
3.设置对象的属性和方法的值
4.返回创建后新的对象
内存空间:对象的创建过程它的空间内存图如下:
对象到底占了几块空间?
两块!!一个是栈,一个是堆,
堆里面是对象,栈里面存的是该对象所在空间的地址或者说叫做引用!
字面量的方式创建对象
自定义构造函数可以通过instanceof来判断此对象属于什么类型的
字面量的方式创建对象
var obj = {};//空对象
//添加属性
obj.name = "小白";
obj.age = 10;
obj.sayHi = function () {
//添加方法
console.log("我是:" + this.name);
}
obj.sayHi();
//缺陷:现在添加的所有属性和方法都是在大括号外面添加的
//如果说,我要是能够和数组一样…
//和数组一样都是在外面添加的
var arr = [];
arr[0] = 10;
//优化后的写法:(是一个整体)
//等号变成了冒号,分号变成了逗号
var obj2={
name:"小明",
age:20,
sayHi:function(){
console.log("我是"+this.name);
},
eat:function(){
console.log("吃了")
}
}
obj2.sayHi();
obj2.eat();
//类似数组
var arr=[10,20,30]
//字面量创建对象的缺陷: 一次性的对象
var obj={
name:"晨光",
age:18,
sex:"女"
};
obj.name="爱心"
console.log(obj.name)
//这个不太好,自定义构造函数比较好,因为可以通过参数来改值
//一开始创建对象的时候传值,而这种方式不可以
//总结缺陷:一次性的对象
点语法
对象.名字=值;对象.名字=函数;
js学习中三种对象:
1.内置对象----js系统自带的对象
2.自定义对象—自己定义的构造函数创建的对象
3.浏览器对象—BOM
内置对象:
- Math
- Date
- String
- Array
- Object
//如何验证变量是不是对象
console.log(Array instanceof Object);
var obj={};
console.log(obj instanceof Object);
浏览器控制台显示结果
true
true
实例对象:通过构造函数创建出来,实例化的对象
静态对象:不需要创建,直接就是一个对象,方法(静态方法)直接通过这个对象名字调用,
实例方法必须通过实例对象调用
静态方法必须通过大写的对象调用
- Math.PI----π—
- Math.E----常数的底数
- Math.abs(值)-----绝对值
- Math.ceil(值)----向上取整
- Math.floor(值)—向下取整