引用类型

Object 类型

  • Object创建有两种方法

    • new 操作符后跟Object
var person = new Object();
person.name = 'dan';
person.age = '25';

var person = {};   // 和上面的例子等价
person.name = 'dan';
person.age = '25';
  • 对象字面量表示法
var person = {
    name : "dan";
    age : "25";
}
  • 访问对象的使用方法
console.log(person.name);     //  建议采用这种方式访问
console.log(person[name]);   

var proName = "name";
console.log(person[proName]);  // 可以通过变量访问属性

person["first name"] ='dan';   // 包含了空格,不能用点访问

Array 类型

  • 数组中的每一项可以保存任何数据类型
  • 数组的创建方式
// 第一种方式
var colors = new Array();
var colors = new Array(20);  // 创建一个length为20的数组
var colors = new Array("red","blue","green");  // 创建一个数组包含red,blue,green

var colors = new Array(3);    // 创建一个有3项的数组
var colors = new Array('red')  // 创建只有一项red的数组

// 第二种方式
var colors = ['red','yellow','blue']
var values = [1,2,]  // 在IE中包含3项1,2,undefined,其他浏览其中包含1,2两项

  • 读取和设置数组值
var colors = [1,2,3,4];
console.log(colors[0]);   //读取第一项
colors[1] = 8;   // 修改第二项
colors[4]  = 5;   // 添加第五项

colors[8]  = 10;
console.log(colors.length);   //  9
console.log(colors[6]);       // undefined
console.log(colors[30]);       // undefined
  • 数组中的length属性不只是只读的,可以设置这个属性,从数组的末尾移除项或者添加项
var colors = [1,2,3];
colors.length = 2;
console.log(colors[2])   // undefined

var arr2 = [1,2,3];
arr2.length = 5;
console.log(arr2);  // [1,2,3,undefined,undefined]

var arr3 = [1,2,3,4];
arr3[arr3.length] = 5;
arr3[arr3.length] = 6;

检测数组

var arr = [];
console.log( arr instanceof Array);  // true
console.log( Array.isArray(arr));   // true
console.log( arr.constructor )   // function Array
console.log( arr.constructor == Array)  // true

转换方法

  • toString(),toLocalString(),valueOf()方法
var colors = ['red','green','yellow'];
console.log(colors.toString()); // red,green,yellow
console.log(colors.toLoaclString());  // red,green,yellow
console.log(colors.valueOf());  // red,green.yellow

console.log(typeof colors.toString()) // string
console.log(typeof colors.toLocalString())  // string
console.log(typeof colors.valueOf())  // Object
console.log( colors.valueOf() instanceof Array)  // true
  • toLoaclString()和toString()区别
var person1 = {
    toLoaclString : function(){
        return "dan";
    },
    toString : function(){
        return "zhu";
    },
}
console.log(person1.toString())  // zhu
console.log(person1.toLocalString())  // dan
  • join()
var colors = ['red','yellow','blue'];
console.log(colors.join(','))  // red,yellow,blue
console.log(colors.join());    // red,yellow,blue
console.log(colors.join('|'))  // red|yellow|blue

栈方法(后进先出实现这个方法是push和pop方法)

  • 数组的push和pop方法
var colors = [];
console.log(colors.push('red','green'));   // 1 返回的是添加后数组的长度,从末尾添加项

console.log(colors.pop())   // green 返回的删除的项,从末尾删除项

队列方法(先进先出实现这个方法是unshift()和pop()方法)

  • shift()和unshift()方法
var colors = ['red','green','blue'];
console.log(colors.shift())    // red  返回删除的第一项

console.log(colors.unshift('black','pink'))  // 5   返回从开头添加后的数组的长度

重排序方法

  • reverse()和sort()方法

reverse()方法

var values = [1,4,8,3,6];
console.log(values.reverse());     //  [6,3,8,4,1] 数组倒序排列

sort()方法

var values = [0,1,5,10,15];
values.sort();
console.log(values);  // 0,1,10,15,5   依据字符串的比较方式
  • 比较函数返回1的时候交换位置
function compare(value1,value2){
    if ( value1 < value2){
        return -1;
    }else if ( value1 > value2){
        return 1;
    }else{
        return 0;
    }
}
var values = [0,3,6,1,8];
values.sort(compare);
console.log(values);   // 0,1,3,6,8

function big(value1,value2){
    if (value1 < value2){
        return 1;
    }else if ( value1 > value2){
        return -1;
    }else{
        return 0;
    }
}
value.sort(big);
console.log(values); // 8,6,3,1,0
  • 对于数值类型或者valueOf()方法返回的数值类型的对象类型
function compare(value1,value2){
    return value2 - value1;   // 由大到小,返回正数的时候交换位置
}
var values = [0,3,6,1,8];
values.sort(compare);
console.log(values);

操作方法

concat()方法

var colors = ['red','green','blue'];
var colors2 = colors.concat();    //  ['red','green','blue'] 不传入参数则是数组的复制
 
//传入一个或多个数组,则将这些数组中的每一项添加到数组中,如果不是数组,这些值将被简单的添加到数组的末尾
var colors3 = colors.concat('yellow',['black','brown'])   //['red','green','blue','yellow','black','brown']

slice()方法

  • 只传入一个参数,返回该参数指定位置到当前数组末尾所有的项
var colors = ['red','yellow','blue','yellow','purple'];
var colors2 = colors.slice(1);   // ['yellow','blue','yellow','purple']
  • 传入两个参数,返回起始位置和结束位置中间的项,但是并不包括结束位置的项
var colors = ['red','yellow','blue','yellow','purple'];
var colors2 = colors.slice(1,4); // ['yellow','blue','yellow']
  • 参数中有一个数负值,则用数组的长度加上该值确定相应的位置
var colors =  ['red','yellow','blue','yellow','purple'];
var colors2 = colors.slice(-2,-1);
console.log(colors2);   //['yellow']


var colors =  ['red','yellow','blue','yellow','purple'];
var colors2 = colors.slice(-3,3);
console.log(colors2);     //['blue']
  • 如果起始位置大于结束位置则返回空数组
var colors =  ['red','yellow','blue','yellow','purple'];
var colors2 = colors.slice(-1,3);
console.log(colors2);     //[] 起始位置是-1+5

splice()方法

  • 删除
    传入两个参数,要删除的位置和删除的项数
var num = [1,3,4,5];
var remove = num.splice(0,1);   // [1]  返回删除的内容,并且是一个数组
console.log(num)     // [3,4,5]
  • 插入
var num = [1,2,3,4];
var removed = num.splice(1,0,8,2);   // []
console.log(num);  // [1,8,2,2,3,4]  从位置1开始添加8,2
  • 替换
var colors = ['red','yellow','orange','blue'];
removed = colors.splice(1,1,'purple');   //['yellow']   返回值永远是删除项以数组形式返回
console.log(colors);  // ['red','purple','orange','blue']

位置方法

indexOf()和lastIndexOf()

var numbers = [1,2,3,4,5,4,3,2,1];
console.log(numbers.indexOf(4));   // 3  从开始位置向后找到4的位置
console.log(numbers.indexOf(1,5))   // 5 从第5位开始找到1的位置

console.log(numbers.lastIndexOf(4))   // 5 从最后位置开始找到4的位置
console.log(numbers.lastIndexOf(1,5))    // 0 从第5为开始向前找,找到1的位置

console.log(numbers.indexOf(8))    // -1 找不到的情况下返回-1

迭代方法

  • every() 对数组中的每一项给定一个函数,该函数的每一项返回true,则返回true
var numbers = [1,2,3,4,5,4,3,2,1];
var result = numbers.every(function(item){
    return (item > 2)
})    
console.log(numbers);   // false
  • some() 对数组中每一项给定一个函数,任意一项返回true,则返回true
var numbers = [1,2,3,4,5,4,3,2,1];
var result = numbers.some(function(item){
    return (item > 2)
})    
console.log(result);    // true
  • filter() 对数组中的每一项给定一个函数,返回为true的值组成的数组
var numbers = [1,2,3,4,5,4,3,2,1];
var filterArr = numbers.filter(function(item){
    return (item>2)
})
console.log(filterArr)   // [3,4,5,4,3]
  • forEach() 对数组的每一项固定的函数,没有返回值
var numbers = [1,2,3,4,5,4,3,2,1];
numbers.forEach(function(item){
    console.log(item)   // 1,2,3,4,5,4,3,2,1
})
  • map() 对数组的每一项给定函数,返回每次调用函数的结果组成的数组
var numbers = [1,2,3,4,5,4,3,2,1];
var mapResult = numbers.map(function(item){
    return item*2   
})
console.log(mapResult)  // [2,4,6,8,10,8,6,4,2]

归并方法

reduce()和reduceRight()方法

var values = [1,2,3,4,5];
var sum = values.reduce(function(prev,cur,index,array){
    console.log(prev);   //  1,3,6,10    每次回调得到的prev是累加得到的数值
    return prev + cur;
})

var sumR = values.reduceRight(function(prev,cur,index,array){
    console.log(prev);    //  5,9,12,14     同上
    return prev + cur;   
})

Date类型

  • 创建一个日期对象
var now = new Date();

Date.parse(),valueOf()

var now = new Date();
console.log(Date.parse(now))  //返回到1970 1.1的毫秒数  
console.log(Date.parse('asdfasd'))    // NaN 不能返回为时间格式
console.log(now.valueOf())    //同上
  • Date.parse()可以解析的几种形式
    1. 6/13/2014
    2. January 12,2004
    3. Tue May 25 2004 00:00:00 GMT-0700
    4. 2004-05-25T00:00:00

Date.UTC()

日期格式化方法

日期、时间组件方法

var nowD = new Date();
//getTime() 
console.log( nowD.getTime());    // 与valueOf()方法返回值相同
//setTime()
var d = new Date();
console.log(d);      // Mon Jul 17 2017 21:36:00 GMT+0800
d.setTime(77771564221);   
console.log(d);      // Mon Jun 19 1972 11:12:44 GMT+0800

//getFullYear(),setFulltYear()设置日期必须是4位数字
//getMonth(), setMonth()  传入的必须大于0~11
d.setMonth(2);
console.log(d)   //Fri Mar 17 2017 21:40:00 GMT+0800

// getDate(),setDate()  如果传入的值超过了这个月中应该有的天数,则月份加一月
// getDay()   返回0~6
// getHours()  setHours()  getMinutes() setMinutes()  getSeconds() setSeconds()

Function类型

  • 函数名实际上也是一个指向函数对象的指针
var anoterSum = sum;
console.log('anoter'+ anoterSum(10,10))  // 20
console.log('sum1' + sum(10,10))      // 20
sum = null;
console.log(anoterSum(10,10))    // 20
console.log(sum(10,10));    // sum is not a function
function sum ( num1,num2){
    return num1 + num2;
}

没有重载的概念

  • 在创建第二个函数时,实际上覆盖了引用第一个函数的变量
function addSome(num){
    return num + 100
}
function addSome(num){
    return num + 200
}
var result = addSome(100)     // 300

函数声明与函数表达式

  • 解析器在向执行环境中加载数据时,对函数声明和函数表达式并非一视同仁,解析器会率先读取函数声明,并且在执行代码的之前可以访问,但是函数表达式,必须等到解析器执行到它所在的代码行,才会真正被解析执行
console.log( sum ( 10,10));   // 20 
function sum (num1,num2){
    return num1 + num2
}

console.log(num2(10,10));
var num2 = function(num1,num2){
    return num1 + num2
}

作为值的函数

  • 不仅可以像传递参数一样把一个函数传递给另一个函数,而且还可以将一个函数作为另一个函数的结果返回
function callSomeFunction(someFunction,someArgument){
    return someFunction(someArgument)
}
function getGreeting(name){
    return "hello" + name
}
var result = callSomeFunction(getGreeting,'dan');   // hello dan

函数内部属性

  • 两个特殊的对象,this,arguments
  • arguments的主要用途是保存函数参数,这个对象还有一个callee的属性,该属性是一个指针,指向拥有这个arguments对象的函数
function factor(num){
    if ( num < = 1){
        return 1;
    }else{
        return num * factor( num - 1)
    }
}


function factor(num){
    if ( num <= 1){
        return 1;
    }else{
        return num * arguments.callee(num-1)
    }
}
  • 函数中this的指向问题,函数在哪里调用,this就指向为哪个
<body>
<div id="box">123</div>
<script>
    var oBox = document.getElementById('box');
    function show(){
        console.log( this )      
    }
    oBox.onclick = function(){
        show();      //   this为window
    }

    oBox.onclick = show;    // this为div
</script>

<div id="box" onclick="show()">123</div>    // this为window
<script>
    var oBox = document.getElementById('box');
    function show(){
        console.log( this )
    }
    
</script>

</body>

  • caller属性,这个属性保存了当前函数的函数引用,如果在全局中调用当前函数,则返回null
function outer(){
    inner()
}
function inner(){
    console.log(inner.caller)
}
outer()    // function outer() .....在哪个函数中调用则返回哪个函数的引用

inner()    // null
  • 为了实现更好的耦合性(修改一个对象的时候同时需要修改另一个对象),通过arguments.callee.caller
function outer(){
    inner()
}
function inner(){
    console.log(arguments.callee.caller)
}
outer()    // function outer() .....在哪个函数中调用则返回哪个函数的引用

inner()    // null

函数的属性和方法

  • length属性表示函数希望接收的命名参数的个数
function sayName(name){
    alert(name)
}
alert(sayName.length)   //1 接受参数的个数
  • prototype属性,toString(),valueOf()等方法实际上保存在prototype名下。只是 通过各自对象实例访问
  • apply()和call()方法 -- 用途在特定的作用域中调用函数,实际上等于设置函数体内this对象的值
window.color = "red";
var o = {color: 'blue'};
function sayColor(){
    alert(this.color);
}
sayColor();    // red
sayColor.call(window)   // red
sayColor.call(o)     // blue   修改了函数体内的this指向,指向为对象o
  • apply和call的区别
function sum(num1,num2){
    return num1 + num2;
}
function callSum(num1,num2){
    return sum.apply(this,arguments)   // 参数用arguments表示
}
function callSum1(num1,num2){
    return sum.apply(this,[num1,num2])    // 参数是一个数组列表
}

function callSum2(num1,num2){
    return sum.call(this,num1,num2)       // 参数一次传入
}
  • bind()用法
window.color = 'red';
var o = {color: 'blue'};
function sayColor(){
    alert(this.color);
}
var objectSayColor = sayColor.bind(o);
objectSayColor();   // blue

基本类型包装

var s1 = 'some text';
var s2 = s1.substring(2);

var s1 = new String('some text');   // 创建string类型的一个实例    object
var s2 = s1.substring(2);           // 在实例上调用指定的方法
s1 = null;                          // 销毁这个实例
  • 引用类型和基本类型的包装主要区别在于对象的生存期,使用new操作符创建的引用类型的实例,在执行流离开当前作用域之前都会一直保存在内存中,而自动创建的基本类型的对象,只存在于一行代码的执行瞬间
var s1 = 'some text';
s1.color = 'red';
console.log(s1.color);     // undefined
  • 对基本包装类型的实例调用typeof会返回object,所有的基本包装类型的对象转换为布尔值都是true

Boolean类型

var booleanValue = new Boolean(true);
    console.log(typeof booleanValue.valueOf());    // boolean
    console.log( typeof booleanValue.toString());  // string
var falseObject = new Boolean(false);
var result = falseObject && true;
console.log(falseObject)
console.log(result);   // true  布尔表达式中所有的对象都转换为true

var falseValue = false;
result = falseVaule && true;
console.log(result);      // false
var falseObject = new Boolean(false);
console.log(typeof falseObject);   // object
console.log(falseObject);          //Boolean {[[PrimitiveValue]]: false}
console.log(falseObject instanceof Boolean);   // true

var a = false;
console.log( typeof a);           // boolean
console.log(a);                   // false
console.log(a instanceof Boolean);    // false

Number类型

var numObject = new Number(10);
var num = 10;
console.log(typeof numObject);   // Object
console.log(typeof num);      // number
console.log(numObject instanceof Number);  // true
console.log(num instanceof number);     // false
console.log(typeof numObject.valueOf());    // number
console.log(typeof numObject.toString());   // string
console.log(typeof numObject.toLocaleString());    // string
  • toFixed()方法 (详情见数据类型)
    四舍五入的方法,并且将数字转化为字符串的格式
var s = 123.090;
console.log(s.toFixed(1));               // 123.1  四舍五入
var s = 123.000;
console.log(s.toFixed(1));               // 123.0
console.log(typeof s.toFixed(1))     //string
  • toExponential()方法
    返回以指数表示法,表示数值的字符串形式
    方法接收一个参数,该参数指定输出结果中的小数位数
var num = 10;
console.log(num.toExponential(1))
console.log(typeof num.toExponential(1));   // string

var num = 100;
console.log(num.toExponential(1));  //  1.0e+2
console.log(num.toExponential(2));  // 1.00e+2

var num = 198;
console.log(num.toExponential(1));   // 2.0e+2
console.log(num.toExponential(2));   // 1.98e+2
  • toPrecision()方法
    这个方法可能返回toFixed,可能返回指数格式
var num = 99;
console.log(num.toPrecision(1))  // 1e+2
console.log(num.toPrecision(2))  // 99
console.log(num.toPrecision(3))  // 99.0
console.log(typeof num.toPrecision(2));    // string

string()类型

  • 基本类型的包装
var strOb = new String('faskdlf');
  • valueOf(),toLocaleString(),toString()方法都返回的是包装对象的基本字符串值
  • length属性
var str = 'hello world';
console.log(str.length);
  • 字符方法 charAt(),charCodeAt()
var str = 'hello world';
console.log(str.charAt(1));   // e
console.log(str.charCodeAt(1))   // 101 e的字符编码

var str = 'hello world';
console.log(str[1]);    //  e
  • 字符串的操作方法 concat(),slice(),substr(),substring()
var str = 'hello';
var result = str.concat('world');
console.log(str);   // hello
console.log(result);   // hello world

var str = 'hello world';
console.log(str.slice(3));   // 'lo world'
console.log(str.substr(3));  // 'lo world'
console.log(str.substring(3))// 'lo world'
console.log(str.slice(3,7));   // 'lo w' 第三位开始不包括第七位
console.log(str.substr(3,7));   // 'lo w' 同上
console.log(str.substring(3,7));   // 'lo worl'  从第三位开始

console.log( str.slice(-3));   // 'rld'  所有的负值加上字符串的长度    这种方法正好得到字符串的最后几位
console.log(str.slice(3,-4))   //  'lo w'  同上

console.log(str.substring(-3));   // 'hello world'   所有的负值都转变为0
console.log( str.substring(3,-4))  // 'hel'  => str.substring(3,0)  => str.substring(0,3)

console.log(str.substr(-3))   // 'rld'   第一个负值变成字符串的长度加负值,第二个是0
console.log(str.substr(3,-4))   // '' 空字符串 -4 => 0
  • 字符串位置方法 indexOf(),lastIndexOf()
    都是从一个字符串搜索给定的子字符串,然后返回字符串的位置,没有找到,返回-1
var str = 'hello world';
console.log(str.indexOf('o')); // 4
console.log(str.lastIndexOf('o'))   // 7

console.log(str.indexOf('o',6))   // 7 从第6位开始向后找到o的位置
console.log(str.lastIndexOf('o',6))   // 4 从第6位开始向前找到o的位置  
  • trim()方法
var str = '   hello world   ';
console.log(str.trim());   // hello world
trimLeft()  删除开头的空格
trimRight() 删除末尾的空格
  • 字符串的大小写转换
var str = 'hello WORLD';
console.log(str.toLocaleUpperCase())   // HELLO WORLD
console.log(str.toUpperCase())    // HELLO WORLD
console.log(str.toLocaleLowerCase())   // hello world
console.log(str.toLowerCase())    // hello world
  • 字符串的模式匹配方法

  • split()方法

var color = 'red,blue,green';
var color1 = color.split(',')   //['red','blue','green']
var color2 = color.split(',',2) //['red','blue']
  • localeCompare()方法
var str = 'yellow';
console.log(str.localeCompare('brick'))  // 1
console.log(str.localeCompare('yellow'))  // 0
console.log(str.localeCompare('yella'))   // 1
console.log(str.localeCompare('yel'))     // 1
console.log(str.localeCompare('zoo'))    // -1
  • fromCharCode()方法
console.log(str.fromCharCode(104,101,108,108,111))  // hello

单体内置对象

由js实现提供的,不依赖宿主环境的对象,这些在js程序执行之前就已经存在了,开发不必显示的实例化内置对象

Global对象

事实上没有全局变量和全局属性,所有在全局中定义的属性和函数都是Global对象的属性,像isNaN(),parseInt()等,实际上都是Global对象的方法

URI编码方法
  • encodeURI()和encodeURIComponent()方法
    encodeURI()用于整个URI,但是不会对特殊字符编码,例如冒号,斜杠,井号
    encodeURIComponent()对它发现的任何非标准字符进行编码
    var uri = 'http://www.hao123 val.html#start'
    console.log(encodeURI(uri));    //  http://www.hao123%20val.html#start
    console.log(encodeURIComponent(uri));    // http%3A%2F%2Fwww.hao123%20val.html%23start
    
eval()方法

他只接受一个参数,即要执行的js的字符串

eval("alert('hi')")   // 等价于alert('hi')

eval("var msg = 'hello'");
alert(msg);    // hello
  • 在eval()中创建的任何变量和函数都不会被提升,它们只有在eval()执行的时候创建
  • 严格模式下,在外部访问不了eval创建的任何变量或者函数

Global对象的属性

特殊值,undefined,NaN,Infinity都是Global的对象属性,所有原生引用类型的构造函数,object,function,都是Global对象的属性
ES5 明确禁止给undefined,NaN,Infinity赋值

Window对象

  • ES5虽然没有明确指出Global对象,但web将这个全局对象作为window对象的一部分实现,因此,全局中声明的函数,变量成为了window对象的属性
var color = 'red';
function sayColor(){
    console.log(window.color)   //  red  说明全局变量就是window对象的属性
}
window.sayColor();    // 这里等同于sayColor()   
var global = function(){
    return this;
}()
console.log(global)   // window对象

Math对象

  • Math对象的属性(数学计算中运用的特殊值Math.E) p134

  • min()和max()方法

var max = Math.max(3,56,78,31);    // 78
var min = Math.min(3,56,7,9,2)     // 2
var values = [1,2,3,4,5,6,7,8];
var max = Math.max.apply(Math,values);   8
  • 舍入方法
    Math.ceil()向上取整
    Math.floor()向下取整
    Math.round()四舍五入

  • random()方法
    Math.random()返回的是一个大于0,小于1的随机数
    值 = Math.floor(Math.random * 可能值的个数 + 最小数)

var num = Math.floor(Math.random * 10 + 1)   // 1~10

其他方法 p136

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

推荐阅读更多精彩内容