JavaScript2

1、Math对象

Math.PI圆周率 π

Math.ceil()向上取整    返回的是大于或等于函数参数,并且与之最接近的整数     如:Math.ceil(2.1) ->3

Math.floor()向下取整     返回的是小于或等于函数参数,并且与之最接近的整数     如:Math.floor(0.4) ->0    Math.floor(1.9)->1

Math.round(num)返回与num最接近的整数(四舍五入)

Math.max(x,y)返回指定的数中带有较大的值的那个数

Math.min(x,y)返回指定的数字中带有最低值的数字

Math.abs()返回数的绝对值

Math.pow(x,y)x 的 y 次幂

Math.random()返回介于 0 ~ 1 之间的一个随机数     [0,1)

从1开始 至 任意值   [1 , 任意值]

parseInt(Math.random()*上限+1);

范围值:从任意值开始至任意值

parseInt(Math.random()*(上限-下限+1)+下限);

例如:获取-30到30

Math.cel(Math.randon()*60-30)

Math.floor(Math.randon()*60-30)

2、日期对象

var mydate=new Date();获取当前时间

eg:获取2017.10.1  new Date(2017,9,1)

简单写法:

var time=document.getElementByID(“time”);

time.innerHTML=d.toLocalDateString()+d.toLocalTimeString();

mydate.getFullYear()获取年份

mydate.getMonth()

获取月份,月份从0开始的,即0就是1月

mydate.getDate()获取日期

mydate.getDay()获取星期    0-->周日    1-->周一

mydate.getHours()获取当前的小时

mydate.getMinutes()获取分钟

mydate.getSeconds()获取秒

mydate.getMilliseconds()获取毫秒

mydate.getYear()

返回一个距1900的偏移量,这个偏移量加上1900就是正确的年份

mydate.getTime()

返回一个整数值,这个整数代表了从1970年1月1日开始计算到Date对象中的时间之间的毫秒数

mydate.setTime()

设置时间

d.setDate(mydate.getDate()+1);

setInterval()方法与setTimeout()方法

setInterval("调用的函数", "指定的时间间隔")

间隔调用

clearInterval(interID)停止调用

setTimeout()方法

setTimeout(“调用的函数”, “指定的时间后")延迟时间

获取元素的左偏移值elem.style.left

跳转到网页

Window.location.href=”http://www.baidu.com”

3、String对象

创建string对象:

var str = new String();

方法:

length返回字符串的长度

charAt()返回指定位置的字符。字符串中第一个字符的下标是 0。如果参数 index 不在 0 与 string.length-1 之间,该方法将返回一个空字符串。

charCodeAt ()返回一个整数,代表指定位置上字符的 Unicode 编码 (返回值是 0 - 65535 之间的整数)

参数:必需。表示字符串中某个位置的数字,即字符在字符串中的下标。

fromCharCode()从一些 Unicode 字符值中返回一个字符串

replace(str/regexp,newstr)进行文字替换,用newstr替换str/regexp,返回替换后的字符串的复制(只会替换一个)

如果想替换多个,repalce(/a/g,”b”);

//所有a会替换为b

substr(2,5)//从第二个,截取五个

substring(2,5)//从第二个截取到第五个(不含第5个)

如果 substring 是最后有一个数负数 那么默认

substring(2,-8);从第0个截取到第2个不含第2

toLowerCase()//返回一个字符串,字符串中的字母转化为小写字母

toUpperCase()//返回一个字符串,字符串中的字母转化为大写字母

stringObject.split(separator,limit)//把字符串分割为字符串数组

separator:从该参数指定的地方分割,limit:分割的次数

如果把空字符串 ("") 用作separator,那么 stringObject 中的每个字符之间都会被分割。

indexOf(字串,从哪个位置开始找)//返回字符串内第一次出现子字符串的位置,如果没有返回-1

lastIndexOf()//返回字符串内最后一次出现子字符串的位置,如果没有返回-1

indexOf(“s”,从第几个开始找)

lastIndexOf(“s”)从后面开始找

string与new String的区别:

new出来的实例,即使值一样,他们也不相等。

eg:var str1=”a good string”;

var str2=new String(“a good string”);

str2是string对象的一个实例,对象可以动态随便的添加属性和方法,而字符串类型不能。

4、事件

onclick单击

onblur() 当鼠标离开文本框

onsubmit() 当用户单击 submit按钮

onkeyup()   当键盘弹起

onkeydown() 当键盘按下

5、window常见属性

window.innerWidth浏览器窗口的宽度

innerHeigt浏览器窗口的高度

var agent = window.navigator.userAgent; //检测浏览器类型(浏览器头的信息)

window.location.href=”http://www.baidu.com”//跳转

6、数组

(1)创建数组

var 变量名=[ 元素1,元素2,元素3,…];

(2)遍历数组

<1>for循环

for(var i=0;i

console.log(arr[i]);

}

<2>for in

for(vinarr){

console.log(v)

}

(3)数组的方法

pop()删除并返回数组的最后一个元素

shift()删除并返回数组的第一个元素

push()向数组的末尾添加一个或更多元素,并返回新的长度。

unshift()向数组的开头添加一个或更多元素,并返回新的长度。

slice(x,y)从数组中选择元素组成新的数组,x和y值指定了开始位置和结束位置。

splice(位置,个数[,元素1,元素2,……])从数组中删除或替换元素

sort()以字母表的顺序(unicode编码)排序

真正能做到排序的方法:

arr.sort(function(a,b){

if(a>b){

return -1;}

else{return 1;}

})

reverse()将元素倒序输出

数组1.concat(数组2,数组3,……)   合并数组

join()将数组中所有元素都转化为字符串

toString()返回一个字符串,该字符串包含数组中的所有元素,各个元素间用逗号分隔

(4)求最大(最小)值的方法

方法1循环vararr =[11,8,25,998,12];

vartempMax=arr[0];for(vari=0;i

if(arr[i]>tempMax){

tempMax=arr[i]

}

}console.log(tempMax);

方法2Math.max.apply(null,arr);

补充:call()和apply()方法的区别

它们各自的定义:

apply:应用某一对象的一个方法,用另一个对象替换当前对象。例如:B.apply(A, arguments);即A对象应用B对象的方法。

call:调用一个对象的一个方法,以另一个对象替换当前对象。例如:B.call(A, args1,args2);即A对象调用B对象的方法。

它们的共同之处:

都“可以用来代替另一个对象调用一个方法,将一个函数的对象上下文从初始的上下文改变为由thisObj指定的新对象”。

它们的不同之处:

apply:最多只能有两个参数——新this对象和一个数组argArray。如果给该方法传递多个参数,则把参数都写进这个数组里面,当然,即使只有一个参数,也要写进数组里。如果argArray不是一个有效的数组或arguments对象,那么将导致一个TypeError。如果没有提供argArray和thisObj任何一个参数,那么Global对象将被用作thisObj,并且无法被传递任何参数。

call:它可以接受多个参数,第一个参数与apply一样,后面则是一串参数列表。这个方法主要用在js对象各方法相互调用的时候,使当前this实例指针保持一致,或者在特殊情况下需要改变this指针。如果没有提供thisObj参数,那么

Global 对象被用作thisObj。

实际上,apply和call的功能是一样的,只是传入的参数列表形式不同。

(5)去掉数组中重复的数

vararr =[11,8,25,998,44,32,11,25,12];

vararr2=[];

for(vari=0; i

if(arr2.indexOf(arr[i])==-1){

// 如果在数组2中没有当前的这个数

arr2.push(arr[i]);

// 就把当前的数放入到数组2中

}

}console.log(arr2);

JS判断一个变量的类型:

functionobj(value){

varleixing= Object.prototype.toString.call(value);

returnleixing;

}

varstr = "12,3,2";

alert(obj(str));//输出[object String]

vararr =[12,3,2];

alert(obj(arr));//输出[object Array]

JS判断是不是数组:

<1>function isArray(s){

var flag = s instanceof Array;

if(flag && s.constructor == Array){

alert("是数组");}

else{alert("不是数组");}

}var a =[1,2,3];

isArray(a);

<2>function isArray(object){

var falg == object && typeof object ===‘object’&& Array == object.constructor;

if(flag && s.constructor == Array){

alert("是数组");}

else{alert("不是数组");}

}var a =[1,2,3];

isArray(a);

}

7、windows对象

JavaScript组成:ECMAScript,BOM(浏览器对象模型),DOM(文档对象模型)。

(1)window open 和close 方法

open:

window.open(URL,name,specs,replace)

URL:打开指定的地址

name:_blank(在新的窗口打开),_self(覆盖原来的窗口)

specs:参数,有width height top left等。

close:自己打开的窗口才能关闭

(2)history对象

back()后退历史记录

forward()前进历史记录

go()跳转到某个历史记录

(3)location 对象

href获取当前的地址 如果设置值是跳转到 设置地址reload()刷新(重新加载)

8、document对象

1.方法

getElementById()返回对拥有指定id的第一个对象的引用

getElementsByName()返回带有指定名称的对象的集合

getElementsByTagName()返回带有指定标签名的对象的集合

getElementsByClassName()返回带有指定class名的对象的集合

querySelector返回指定css选择器对象的第一个

querySelectorAll()返回指定css选择器对象的集合

2.visibility属性

visible表示元素是可见的

hidden表示元素是不可见的

语法:object.style.visibility="值"

3.display属性

none

block

inline-block

语法:object.style.display="值"

9、DOM编程

(1)查看/修改属性节点

getAttribute("属性名")

setAttribute("属性名","属性值")

(2)节点关系

parentNode父亲节点

firstChild第一个子节点

lastChild最后一个子节点

priviousSibling上一个兄弟节点

nextSibling下一个兄弟节点

(3)创建和增加节点的方法

createElement():创建节点

appendChild():末尾追加方式插入节点

insertBefore():在指定节点前插入新节点

cloneNode(true):克隆节点

(4)删除和替换节点

removeChild():删除节点

replaceChild(新的,被替换的):替换节点

(5)表格操作

插入行:table.insertRow(num);

插入列:row.insertCell(num);

删除列:table.deleteRow(num);

html里面有9种类型的节点

元素节点节点类型 nodeType ==1

文本节点节点类型 nodeType ==3

获取/设置元素的类名:

elem.className="name1 name2"

获取/设置的行内样式属性:

elem.style.样式名

如果样式名是带中划线,去掉中划线 后面的单词首字母大写eg:elem.style.fontSize="18px";

获取元素的最终样式:

document.defaultView.getComputedStyle(elem,null)

ie方式:elem.currentStyle

获取元素的高:

elem.offsetHeight 内容+padding+边框

elem.clientHeight 内容+padding   不加滚动条高度

获取元素的滚动距离:

scrollHeight默认 内容+padding 如果有滚动 是滚动区域的高

////////////////////////

console.log("clientHeight",p.clientHeight)

console.log("offsetHeight",p.offsetHeight)  //推荐

console.log("scrollHeight",p.scrollHeight)

clientWidth当前宽

offsetwidth偏移宽

scrollWidth滚动宽

获取元素到浏览器四周的距离:

document.body.scrollTop窗口滚动垂直方向的距离

document.body.scrollLeft窗口滚动水平方向的距离

////////////////////////////

elem.scrollTop获取元素垂直方向的距离

window.scrollTo(左右距离,上下距离)

元素到浏览器边界的距离:

Var rect = elem.getBoundingClientRect()

元素距body最顶部的距离-窗口滚动的距离==rect.top,即

elem.offsetTop-document.body.scrollTop

补充:

For循环+匿名函数自执行+setTimeout  做10次   从1到100  (for控制输出的次数,setTimeout控制执行间隔时间)

for(var i = 0;i<10;i++){

!function(i){

var j = i;

setTimeout(function(){

console.log((j+1)*10);

},j*1000)

}(i)

}

10、事件

事件模型:内联模型、脚本模型、DOM2模型

(1)鼠标事件

单击的对象:srcElement

单击时候是否按下ctrl键:ctrlKey

单击时候是否按下shift键:shiftKey

距浏览器窗口左上角距离:

layerX

layerY

pageX

pageY

距离button(单击对象)srcElemet 左上角位置:

offsetX

offsetY

(2)键盘事件

keyCode键盘上每一个键都会有一个键盘编码           判断是哪个键被按下了(eg:空格键是32)

鼠标滚轮 onmousewheel

deltaY  125向下   -125 向上

(3)事件流

冒泡小到大

即事件由最开始的元素接收,让后逐级向上传播到最不具体的那个节点(文档)

捕获大到小

即由最不具体的那个节点(文档)元素接收,然后逐级向下广播到最具体的那个元素

停止事件冒泡  stopPropagation()

添加事件:

addEventListener(事件名,处理事件函数,是否用捕获)

删除事件:

removeEventListener(事件名,处理事件函数,是否用捕获)

11、Cookie

cookie由名/值对形式的文本组成:name=value。

cookie="name=value;expires=date;path=/;domain=m.qq.com;secure"

(1)创建cookie

function setCookie(name,value,day,path){

var cookieText=name+"="+value;

if(day>0){

var d=new Date();

d.setDate(d.getDate()+day)

cookieText+=";expires="+d;}

if(path){

cookieText+=";path="+path;

}

document.cookie=cookieText;

}

(2)获取cookie

function getCookie(name){

var start=0;

var end=0;

if(document.cookie.indexOf(name+"=")!=-1){

start=document.cookie.indexOf(name+"=");

end=document.cookie.indexOf(";",start);

if(end==-1){end=document.cookie.lenght;}

return document.cookie.substring(start+name.length+1,end);

}

}

(3)删除cookie

function unsetCookie(name){

document.cookie=name+"=;expires="+new Date(0);

}

(4)本地存储

存储在本地的数据 没有时间限制

sessionStrage与localStrage区别:

sessionStorage/localStorage session 浏览器关掉就没有了

L不发送到服务器C会发送到服务器

L没有时间限制 C 可以设置时间

L空间大C小

L条没有现在 C有限制

L新浏览器 C所有浏览器

12、正则表达式

(1)创建方式

var reg = /表达式/附加参数;

var reg = new RegExp(“表达式”,“附加参数”);

(2)方法

test:检测字符串中指定的值,返回true或false;

lastIndex  一个整数,标示开始下一次匹配的字符位置,该属性存放一个整数,它声明的是上一次匹配文本之后的第一个字符的位置。

exec():用于检索字符串中的正则表达式的匹配。

RegExpObject.exec(string)

返回值:

返回一个数组,其中存放匹配的结果。如果未找到匹配,则返回值为 null。

属性:

global:RegExp对象是否具有标志g;

ignoreCase:RegExp对象是否具有标志i

multiline:RegExp对象是否具有标志m

(3)常用符号

/.../代表一个模式的开始和结束

^匹配字符串的开始

$匹配字符串的结束

\s任何空白字符

\S任何非空白字符

\d匹配一个数字字符,等价于[0-9]

\D除了数字之外的任何字符,等价于[^0-9]

\w匹配一个数字、下划线或字母字符,等价于[A-Za-z0-9_]

\W匹配任何非单字字符,等价于[^A-Za-z0-9_]

.除了换行符之外的任意字符

(如果要使用,写法“\.”)

{n}匹配前一项n次

{n, }匹配前一项n次,或者多次

{n,m}匹配前一项至少n次,但是不能超过m次

*匹配前一项0次或多次,等价于{0, }

+匹配前一项1次或多次,等价于{1,}

?匹配前一项0次或1次,也就是说前一项是可选的,等价于{0,1}

add()方法:向select 添加一个option元素。selectObject.add(option,before)

option 必需。要添加选项元素。必需是 option 或 optgroup 元素。

before 必需。在选项数组的该元素之前增加新的元素。如果该参数是null,元素添加到选项数组的末尾。

var Opt = new Option(“文本”,“值”,true,true);

后面两个true分别表示默认被选中和有效!

13、匿名函数和闭包

解释:匿名函数就是没有名字的函数,闭包是可访问一个函数作用域里变量的函数。

闭包是指有权访问另一个函数作用域中的变量的函数,创建闭包的常见的方式,就是在一个函数内部创建另一个函数,通过另一个函数访问这个函数的局部变量。

使用闭包的优点:

1.希望一个变量长期驻扎在内存中

2.避免全局变量的污染

3.私有成员的存在

内存泄漏:

1.全局变量引起的内存泄漏

function leaks(){

leak = 'xxxxxx';//leak 成为一个全局变量,不会被回收

}

123

2.闭包引起的内存泄漏

var leaks = (function(){

var leak = 'xxxxxx';// 被闭包所引用,不会被回收

return function(){

console.log(leak);

}

})()

123456

14、淡入淡出动画

淡入

function fadeIn(el){

setOpacity(el,0);

for(var i = 0;i <= 100;i++){

(function(num){

setTimeout(function(){

setOpacity(el,num);

},10 * num);

})(i);

}

}

淡出

function fadeOut(ele){

for(var i = 0;i <= 100;i++){

(function(){

var p = i;

setTimeout(function(){

setOpacity(ele,p);

},10 * (100 - p));

})();

}

}

兼容性

function setOpacity(elem,level){

if(elem.filters){  //ie8

elem.style.filter = "alpha(opacity=" + level + ")";

}else{  //w3c

elem.style.opacity = level / 100;

}

}

15、面向对象与原型

面向对象三大特性:封装,继承,多态。

1.封装

(1)工厂模式创建对象

function createObj(name,sex){

var obj = new Object();

obj.name = name;

obj.sex = sex;

obj.say=function(){

return obj.name + ":" + obj.sex;

}

return obj;

}

var a = createObj("小明","男");

var b = createObj("小红","女");

alert(a.say());

alert(b.say());

缺点:无法判断对象的类型

(2)构造函数创建对象

function Box(name,sex){

this.name = name;

this.sex = sex;

this.say=function(){

return this.name + ":" + this.sex;

}

}

var a = new Box("小明","男");

var b = new Box("小红","女");

alert(a.say());

alert(b.say());

缺点:增加了内存消耗

问题:

new Object()在什么地方执行了?

执行的过程如下:

1.当使用了构造函数,并且new 构造函数(),那么就后台执行了new Object();

2.将构造函数的作用域给新对象,(即new Object()创建出的对象),而函数体内的this就代表new Object()出来的对象。

3.执行构造函数内的代码;

4.返回新对象(后台直接返回)。

(3)原型

原型模式的执行流程:

1.先查找构造函数实例里的属性或方法,如果有,立刻返回;

2.如果构造函数实例里没有,则去它的原型对象里找,如果有,就返回;

注意:虽然我们可以通过对象实例访问保存在原型中的值,但却不能访问通过对象实例重写原型中的值。

<1>创建原型对象

prototype通过调用构造函数而创建的那个对象的原型对象。使用原型的好处可以让所有对象实例共享它所包含的属性和方法。

function Box(){}

Box.prototype.name="小明";

Box.prototype.sex = "男";

Box.prototype.say=function(){

alert(this.name + ":" + this.sex) ;

}

var a = new Box();

a.sex = "女";

a.say();

<2>原型检测方式

1、Box.isPrototypeOf()判断一个对象是否指向了该构造函数的原型对象。

删除属性:deletea.name;

//删除属性   delete只能删除自己的,不能删除原型里的属性。

2、实例对象.hasOwnProperty(“sex”)

eg:a.hasOwnProperty(“sex”)

//实例里有返回true,否则返回false

3、in操作符

通过对象能够访问给定属性时返回true,无论该属性存在于实例中还是原型中。

alert(“name”in box);//true,存在实例中或原型中

判断是否只有原型中存在属性:

function isPro(obj,pro){

if(!obj.hasOwnProperty(pro)){

if(pro in obj){

return true;

}

}

return false;

}

4、原型重写

Box.prototype={

constructor:Box,

name:"小明",

sex:"男",

say:function(){

return this.name + ":" + this.sex;

}

};

5、组合模式  (构造函数+原型)

构造函数里:写属性(实际上写到了实例里)

原型里:写方法

function Box(name,sex){

this.name = name;

this.sex = sex;

}

Box.prototype={

constructor:Box,

say:function(){

return this.name + ":" + this.sex;

},

sing:function(){

alert("hello");

}

};

var a = new Box("小明","男");

var b = new Box("小红","女");

console.log(a.say());

b.sing();

2.继承

1、原型链继承

function Parent(){

this.name = "父类";

this.age = "34";

}

function Child(){

this.name = "子类";

this.age = "12";

}

Child.prototype = new Parent();

var c = new Child();

(c.__proto__=====>Parent.prototype)

console.log(c.age);

缺点:1、 无法从子类中调用父类的构造函数, 这样就没有办法把子类中属性赋值给父类。

2、 父类中属性是在子类的原型中的,这违背了我们前面所讲的封装的理念。

2、对象冒充继承(伪造对象、经典继承)

function Parent(name,age){

this.name = name;

this.age = age;

}

function Child(name,age,sex){

Parent.call(this,name,age);

//对象冒充,给父类传参

this.sex = sex;

}

var a = new Child("小明","20","男");

console.log(a.name);

console.log(a);

缺点:无原型

3、组合继承

function Parent(name,age){

this.name = name;

this.age = age;

}

function Child(name,age,sex){

Parent.apply(this,[name,age]);

this.sex = sex;

}

Child.prototype = new Parent();

var a = new Child("小明","20","男");

alert(a.name);

console.log(a);

缺点:父类在使用过程中会被调用两次:一次是创建子类型的时候,另一次是在子类型构造函数的内部。

4、ES6类的继承

class语法:

class Box{

constructor(name,age){

this.name = name;

this.age = age;

}

say(){

return this.name + ":" + this.age;

}

static max(x,y){

if(x>y){

return x;

}

else{

return y;

}

}

}

var a = new Box("小明","20");

//alert(a.name);

console.log(a);

alert(Box.max(4,2));

类的继承:(关键字extends)

class Parent{

constructor(name,age){

this.name = name;

this.age = age;

}

sing(){

return this.name + ":" + this.age;

}

}

class Child extends Parent{

constructor(name,age,sex){

super(name,age);

this.sex = sex;

}

say(){

alert("lllll");

}

}

var a = new Child("小明","20","男");

console.log(a);

alert(a instanceof Child);//返回true

alert(a instanceof Parent);  //返回true

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容